Ответ 1
Вместо того, чтобы выполнять всю эту тяжелую работу, я просто использую SHFileOperation
:
uses
ShellAPI;
procedure DeleteDirectory(const DirName: string);
var
FileOp: TSHFileOpStruct;
begin
FillChar(FileOp, SizeOf(FileOp), 0);
FileOp.wFunc := FO_DELETE;
FileOp.pFrom := PChar(DirName+#0);//double zero-terminated
FileOp.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION;
SHFileOperation(FileOp);
end;
Для чего стоит, проблема с вашим кодом заключается в том, что он никогда не звонит DeleteFile
. И поэтому каталоги никогда не теряются, вызовы RemoveDir
терпят неудачу и так далее. Отсутствие проверки ошибок в вашем коде не очень помогает, но добавление кода для удаления файлов приведет к получению кода в полупристойной форме. Вам также необходимо позаботиться о рекурсии. Вы должны убедиться, что все дети удалены сначала, а затем родительский контейнер. Это требует определенной квалификации, чтобы получить право. Основной подход таков:
procedure DeleteDirectory(const Name: string);
var
F: TSearchRec;
begin
if FindFirst(Name + '\*', faAnyFile, F) = 0 then begin
try
repeat
if (F.Attr and faDirectory <> 0) then begin
if (F.Name <> '.') and (F.Name <> '..') then begin
DeleteDirectory(Name + '\' + F.Name);
end;
end else begin
DeleteFile(Name + '\' + F.Name);
end;
until FindNext(F) <> 0;
finally
FindClose(F);
end;
RemoveDir(Name);
end;
end;
Я пропустил проверку ошибок для ясности, но вы должны проверить возвращаемые значения DeleteFile
и RemoveDir
.