Prueba con esto:
Código Delphi
[-]function GetSubDirectories(Directory:String):TStrings;
var
r:TSearchRec;
h:Integer;
begin
result:=TStringList.Create;
result.Clear;
if not DirectoryExists(Directory) then
exit;
Directory:=IncludeTrailingBackSlash(Directory);
h:=FindFirst(Directory+'*.*',$10, r);
if h<>0 then
begin
FindClose(r);
exit;
end;
FindNext(r);
repeat
h:=FindNext(r);
if h<>0 then break;
if (r.Attr and $10) =0 then continue;
result.Add(r.Name);
until false;
FindClose(r);
end;
function GetFileNames(Directory:String; Filter:String='*.*'):TStrings;
var
r:TSearchRec;
h:Integer;
begin
if not DirectoryExists(Directory) then
exit;
result:=TStringList.Create;
result.Clear;
Directory:=IncludeTrailingBackSlash(Directory);
h:=FindFirst(Directory+Filter,$10, r);
if h<>0 then
begin
FindClose(r);
exit;
end;
while (r.Name='.') or (r.Name='..') do
h:=FindNext(r);
while h=0 do
begin
if (r.Attr and $10)<>0 then
begin
h:=FindNext(r);
continue;
end;
result.Add(r.Name);
h:=FindNext(r);
end;
FindClose(r);
end;
function Deltree(Directory:String;ConfirmForEachFile:Boolean=False;InformErrors:Boolean=False):Boolean;
var
Directories,Files,ExcludedDirectories:TStrings;
ActualDir:String;
f:Integer;
d:Boolean;
begin
result:=false;
if not DirectoryExists(Directory) then
if InformErrors then
Raise EInOutError.Create(GetErrorString(ERROR_FILE_NOT_FOUND)+' "'+Directory+'".')
else
exit;
ExcludedDirectories:=TStringList.Create;
repeat
ActualDir:=Directory;
Directories:=GetSubDirectories(ActualDir);
f:=0;
while Directories.Count>f do
begin
if ExcludedDirectories.IndexOf(IncludeTrailingBackSlash(ActualDir)+Directories[f])<>-1 then
begin
inc(f);
continue;
end;
ActualDir:=IncludeTrailingBackSlash(ActualDir)+Directories[f];
Directories:=GetSubDirectories(ActualDir);
end;
Files:=GetFileNames(ActualDir);
for f:=0 to Files.Count -1 do
begin
if ConfirmForEachFile then
if MessageBox(Application.Handle,PChar('Delete "'+IncludeTrailingBackSlash(ActualDir)+Files[f]+'?'),'Delete File',MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON2)=IDNO then
continue;
d:=DeleteFile(IncludeTrailingBackSlash(ActualDir)+Files[f]);
if InformErrors and (d=False) then
MessageBox(Application.Handle,PChar(GetLastErrorString+' "'+IncludeTrailingBackSlash(ActualDir)+Files[f]+'."'),'Error',MB_ICONEXCLAMATION);
end;
Files:=GetFileNames(ActualDir);
Directories:=GetSubDirectories(ActualDir);
if (files.Count >0) or (Directories.Count >0) then
begin
ExcludedDirectories.Add(ActualDir);
Continue;
end;
if ConfirmForEachFile then
if MessageBox(Application.Handle,PChar('Delete "'+IncludeTrailingBackSlash(ActualDir)+'?'),'Delete Folder',MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON2)=IDNO then
begin
ExcludedDirectories.Add(ActualDir);
Continue;
end;
d:=RemoveDirectory(Pchar(ActualDir));
if d=False then
begin
ExcludedDirectories.Add(ActualDir);
if InformErrors then
MessageBox(Application.Handle,PChar(GetLastErrorString+' "'+ActualDir+'."'),'Error',MB_ICONEXCLAMATION);
end;
until ActualDir=Directory;
result:= not DirectoryExists(Directory);
ExcludedDirectories.Free;
end;
Espero te sea útil. Saludos