function FullRemoveDir(Dir: string; DeleteAllFilesAndFolders,
StopIfNotAllDeleted, RemoveRoot: boolean): Boolean;
var
i: Integer;
SRec: TSearchRec;
FN: string;
begin
Result := False;
if not DirectoryExists(Dir) then
exit;
Result := True;
// Добавляем слэш в конце и задаем маску - "все файлы и директории"
Dir := IncludeTrailingBackslash(Dir);
i := FindFirst(Dir + '*', faAnyFile, SRec);
try
while i = 0 do
begin
Application.ProcessMessages;
// Получаем полный путь к файлу или директорию
FN := Dir + SRec.Name;
// Если это директория
if SRec.Attr = faDirectory then
begin
// Рекурсивный вызов этой же функции с ключом удаления корня
if (SRec.Name <> '') and (SRec.Name <> '.') and (SRec.Name <> '..') then
begin
if DeleteAllFilesAndFolders then
FileSetAttr(FN, faArchive);
Result := FullRemoveDir(FN, DeleteAllFilesAndFolders,
StopIfNotAllDeleted, True);
if not Result and StopIfNotAllDeleted then
exit;
end;
end
else // Иначе удаляем файл
begin
if DeleteAllFilesAndFolders then
FileSetAttr(FN, faArchive);
Result := SysUtils.DeleteFile(FN);
if not Result and StopIfNotAllDeleted then
exit;
end;
// Берем следующий файл или директорию
i := FindNext(SRec);
end;
finally
SysUtils.FindClose(SRec);
end;
if not Result then
exit;
if RemoveRoot then // Если необходимо удалить корень - удаляем
if not RemoveDir(Dir) then
Result := false;
end;
for i:=0 to lst.Count-1 do
begin
Application.ProcessMessages;
FullRemoveDir(lst.Strings, true, false, true);
end;
Удаление каталогов в цикле
Здравствуйте! Есть LST:TStringList; в нём хранятся пути к папкам.Пытаюсь удалить эти папки в цикле:
Код:
function DelDir(dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;
...
for i:=0 to lst.Count-1 do DelDir(lst.Strings);
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;
...
for i:=0 to lst.Count-1 do DelDir(lst.Strings);
Кстати, удаляются и файлы и директории, полные и пустые.
Спасибо большое, выручил!)