Удалить директорию
Подскажите, как удалить директорию со всеми файлами в ней?
SHFILEOPSTRUCT sh;
sh.hwnd = GetSafeHwnd(); //Для BCB sh.hwnd=FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = "c:\test\0";
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
Этот код выносит все дерево, начиная с (и включая) с: est
// Будь осторожен с этим кодом...
// Я его не проверял
// но мне очень не нравиться строчка
// sh.pFrom = "c:\test\0";
// там по идее должно быть
// sh.pFrom = "c:\\test\0";
// С уважением.
// HexoGenus.
SHFILEOPSTRUCT sh;
sh.hwnd = GetSafeHwnd(); //Для BCB sh.hwnd=FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = "c:\test\0";
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
Этот код выносит все дерево, начиная с (и включая) с: est
// Будь осторожен с этим кодом...
// Я его не проверял
// но мне очень не нравиться строчка
// sh.pFrom = "c:\test\0";
// там по идее должно быть
// sh.pFrom = "c:\\test\0";
// С уважением.
// HexoGenus.
Вот такой код работает:
SHFILEOPSTRUCT sh;
sh.hwnd = FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = "c:\\test\0";
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
но если написать вот так:
AnsiStrimg S;
S = "c:\\test\0";
SHFILEOPSTRUCT sh;
sh.hwnd = FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = S.c_str();
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
то выдаётся ошибка - "Не удаётся удалить файл.Не удаётся произвести чтение с файла или диска"
Причем на точке останова sh.pFrom имеет абсолютно иденитичные значения в первом и втором вариантах. Что за глюк такой?
Вот такой код работает:
SHFILEOPSTRUCT sh;
sh.hwnd = FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = "c:\\test\0";
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
но если написать вот так:
AnsiStrimg S;
S = "c:\\test\0";
SHFILEOPSTRUCT sh;
sh.hwnd = FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = S.c_str();
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
то выдаётся ошибка - "Не удаётся удалить файл.Не удаётся произвести чтение с файла или диска"
Причем на точке останова sh.pFrom имеет абсолютно иденитичные значения в первом и втором вариантах. Что за глюк такой?
Несоответстве типов
ему надо
const char* а ты передаешь просто char *
поэтому кусок меняется так
AnsiString S = AnsiString("c:\\test")+" ";//удлиняем строку:)
char* c=S.c_str(); // вот тут убирался второй '\0'
c[StrLen(c)-1] ='\0';// делаем стросу double null terminated
SHFILEOPSTRUCT sh;
sh.hwnd = Form1->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = c;
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString S;
S = "c:\\test\0";
S.SetLength(S.Length()+1);
// Расширяем строку так что бы 0-символ входил в нее тоже...
// Правда незнаю всегда ли после расширения последний символ будет равен 0
// У меня по крайней мере и так сработало...
// но можно на всякий случай это конкретизировать
// командой S[S.Length()]=0;
S[S.Length()]=0;
SHFILEOPSTRUCT sh;
sh.hwnd = Form1->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = S.c_str();
ShowMessage(sh.pFrom);
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
}
Несоответстве типов
ему надо
const char* а ты передаешь просто char *
поэтому кусок меняется так
AnsiString S = AnsiString("c:\\test")+" ";//удлиняем строку:)
char* c=S.c_str(); // вот тут убирался второй '\0'
c[StrLen(c)-1] ='\0';// делаем стросу double null terminated
SHFILEOPSTRUCT sh;
sh.hwnd = Form1->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = c;
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
Спасибо, работает.