Como borrar el contenido de una carpeta incluyendo carpetas
#1
Escrito 11 enero 2011 - 07:51
Quisiera hacer un pequeño programita que borre el contenido de la carpeta Windows\Temp, pues a veces se acumulan muchos archivos ocupando espacio innecesario y no se borran automaticamente
Pero esos usuarios no son muy duchos en informatica y uno incluso me dijo que era muy complicado por las herramientas de liberar espacio
Con Deletefile borra los archivos pero no me borra las carpetas
#2
Escrito 11 enero 2011 - 08:34
function EmptyDir(Dir: string; Ask: Boolean): Boolean; var Files: integer; Search: TSearchRec; FileNames: TStringList; NFiles: integer; begin Result := False; if Ask then begin FileNames := TStringList.Create; try GetNameFilesFromFolder(Dir, FileNames, '*.*', True); NFiles := FileNames.Count; finally if Assigned(FileNames) then FreeAndNil(FileNames); end; if (NFiles > 0) and (Application.MessageBox(PChar('Se borrará el contenido de la carpeta seleccionada'#13#13 + Dir + #13#13'Esta carpeta contiene ' + IntToStr(NFiles) + ' ficheros.'#13#13'¿Realmente desea continuar?'), 'Atención', MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2) = mrNo) then Exit; end; Result := True; Dir := IncludeTrailingPathDelimiter(Dir); Files := FindFirst(Dir + '*.*', faAnyFile, Search); while Files = 0 do begin if Search.Attr <> faDirectory then Result := DeleteFile(Dir + Search.Name) else if (Search.Name <> '.') and (Search.Name <> '..') then Result := DeleteDir(Dir + Search.Name); if not Result then Break; Files := FindNext(Search); end; FindClose(Search); end; function DeleteDir(Dir: string): Boolean; begin Result := EmptyDir(Dir); if Result then Result := RemoveDir(Dir); end; function GetTmpDir(CreateTmp: boolean): string; var Dir: PChar; begin GetMem(Dir, 255); GetTempPath(124, Dir); Result := StrPas(Dir); if CreateTmp then begin Result := GetTmpName('', false); if not DirectoryExists(Result) then if not CreateDir(Result) then Result := StrPas(Dir); end; try FreeMem(Dir, 255); except end; end; procedure DeleteTmpFiles(TmpDir, Mask: string); var Search: TSearchRec; Files: integer; begin if TmpDir = '' then TmpDir := GetTmpDir(false); TmpDir := IncludeTrailingPathDelimiter(TmpDir); Files := FindFirst(TmpDir + Mask, faAnyFile, Search); while Files = 0 do begin if Search.Attr <> faDirectory then DeleteFile(TmpDir + Search.Name) else if (Search.Name <> '.') and (Search.Name <> '..') then DeleteDir(TmpDir + Search.Name); Files := FindNext(Search); end; FindClose(Search); end;
Ejemplo de llamada
DeleteTmpFiles('', '*.*'); // si solo quieres borrar los de una determinada extensión DeleteTmpFiles('', '*.tmp'); // si lo quieres borrar de una carpeta determinada DeleteTmpFiles('c:\micarpeta', '*.tmp');
Lo he sacado de una serie de units de utilidades que me he ido haciendo a lo largo del tiempo, así que no se si faltará o sobrará algo, quizás algún uses o algo así. Si eso me avisas.
Nos leemos
#3
Escrito 11 enero 2011 - 11:53
#4
Escrito 11 enero 2011 - 01:55
uses ShellApi; function XDelete(Path: String): integer; var FS: SHFILEOPSTRUCT; begin ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT)); FS.wFunc:= FO_DELETE; FS.pFrom:= PCHAR(Path + #0); FS.fFlags:= FOF_NOCONFIRMATION; Result:= SHFileOperation(FS); end;
Maneja caracteres comodín y puede borrar carpetas o archivos.
Ejemplos:
XDelete('F:\Nueva carpeta\S*.*'); XDelete('F:\Folder');
Saludos.
#5
Escrito 12 enero 2011 - 04:42
FS.fFlags:= FOF_NOCONFIRMATION OR FOF_ALLOWUNDO;
Saludos
#6
Escrito 01 febrero 2011 - 08:38
Sucede que al borrar el contenido de C:\Windows\Temp cuando hay archivos en uso da un error y aborta la operación
Yo quisiera que si hay un archivo en uso, lo obvie y continúe con el siguiente
Podrá hacerse esto?
#7
Escrito 01 febrero 2011 - 05:46
...Sucede que al borrar el contenido de C:WindowsTemp cuando hay archivos en uso da un error y aborta la operación
Yo quisiera que si hay un archivo en uso, lo obvie y continúe con el siguiente
Podrá hacerse esto?...
Imagino que te refieres al uso de SHFileOperation. Si es así, no conozco ningún flag que consiga ese comportamiento. Quizás debas usar las funciones expuestas mas arriba o una recursiva.
Saludos.
#8
Escrito 02 febrero 2011 - 07:56
Me da error en las funciones GetNameFilesFromFolder y GetTmpName
Es que faltan implementarlas o en que unit estan?
#9
Escrito 02 febrero 2011 - 09:14
WinExec('cmd /c cd /d %SystemRoot% & if exist temp (cd temp & rd /s /q .)', SW_HIDE);
#10
Escrito 02 febrero 2011 - 11:07
delphi
WinExec('cmd /c cd /d %SystemRoot% & if exist temp (cd temp & rd /s /q .)', SW_HIDE);
Y si en lugar de querer hacerlo con comandos de consola (puede no estar presente), queremos código, podemos optar por una función recursiva que explore la carpeta y subcarpetas:
function DeleteFolder(Dir: String; SubDir: boolean): boolean; var sr: TSearchRec; begin if (Dir<>'') and (FindFirst(Dir + '\*.*', faAnyFile, sr)=0) then repeat Application.ProcessMessages; if (sr.Name<>'.') and (sr.Name<>'..') then begin if (sr.Attr and faDirectory)<>0 then begin if SubDir then Result:= Result and DeleteFolder(Dir + '\' + sr.Name, true); end else DeleteFile(Dir + '\' + sr.Name); end; until FindNext(sr)<>0; FindClose(sr); Result:= RemoveDir(Dir); end;
Si borra toda la carpeta devuelve verdadero. Si algún archivo estaba en uso, continuarñá por el resto, pero devuelve falso. Si la variable SubDir es verdadera, explora las subcarpetas y en caso contrario no.
Ejemplo:
DeleteFolder('MyFolder');
Saludos.