Ir al contenido


Foto

Como borrar el contenido de una carpeta incluyendo carpetas


  • Por favor identifícate para responder
9 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 11 enero 2011 - 07:51

Hola a todos
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  :o *-)

Con Deletefile borra los archivos pero no me borra las carpetas
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 11 enero 2011 - 08:34

Buenas,



delphi
  1. function EmptyDir(Dir: string; Ask: Boolean): Boolean;
  2. var
  3.   Files: integer;
  4.   Search: TSearchRec;
  5.   FileNames: TStringList;
  6.   NFiles: integer;
  7. begin
  8.   Result := False;
  9.  
  10.   if Ask then
  11.   begin
  12.     FileNames := TStringList.Create;
  13.     try
  14.       GetNameFilesFromFolder(Dir, FileNames, '*.*', True);
  15.       NFiles := FileNames.Count;
  16.     finally
  17.       if Assigned(FileNames) then FreeAndNil(FileNames);
  18.     end;
  19.     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
  20.       Exit;
  21.   end;
  22.  
  23.   Result := True;
  24.   Dir := IncludeTrailingPathDelimiter(Dir);
  25.   Files := FindFirst(Dir + '*.*', faAnyFile, Search);
  26.   while Files = 0 do
  27.   begin
  28.     if Search.Attr <> faDirectory then
  29.       Result := DeleteFile(Dir + Search.Name)
  30.     else
  31.       if (Search.Name <> '.') and (Search.Name <> '..') then
  32.         Result := DeleteDir(Dir + Search.Name);
  33.  
  34.     if not Result then Break;
  35.  
  36.     Files := FindNext(Search);
  37.   end;
  38.   FindClose(Search);
  39. end;
  40.  
  41. function DeleteDir(Dir: string): Boolean;
  42. begin
  43.   Result := EmptyDir(Dir);
  44.   if Result then Result := RemoveDir(Dir);
  45. end;
  46.  
  47. function GetTmpDir(CreateTmp: boolean): string;
  48. var
  49.   Dir: PChar;
  50. begin
  51.   GetMem(Dir, 255);
  52.   GetTempPath(124, Dir);
  53.   Result := StrPas(Dir);
  54.  
  55.   if CreateTmp then
  56.   begin
  57.     Result := GetTmpName('', false);
  58.     if not DirectoryExists(Result) then
  59.       if not CreateDir(Result) then
  60.         Result := StrPas(Dir);
  61.   end;
  62.  
  63.   try
  64.     FreeMem(Dir, 255);
  65.   except
  66.   end;
  67. end;
  68.  
  69. procedure DeleteTmpFiles(TmpDir, Mask: string);
  70. var
  71.   Search: TSearchRec;
  72.   Files: integer;
  73. begin
  74.   if TmpDir = '' then
  75.     TmpDir := GetTmpDir(false);
  76.  
  77.   TmpDir := IncludeTrailingPathDelimiter(TmpDir);
  78.  
  79.   Files := FindFirst(TmpDir + Mask, faAnyFile, Search);
  80.   while Files = 0 do
  81.   begin
  82.     if Search.Attr <> faDirectory then
  83.       DeleteFile(TmpDir + Search.Name)
  84.     else
  85.       if (Search.Name <> '.') and (Search.Name <> '..') then
  86.         DeleteDir(TmpDir + Search.Name);
  87.  
  88.     Files := FindNext(Search);
  89.   end;
  90.   FindClose(Search);
  91. end;



Ejemplo de llamada



delphi
  1. DeleteTmpFiles('', '*.*');
  2.  
  3. // si solo quieres borrar los de una determinada extensión
  4. DeleteTmpFiles('', '*.tmp');
  5.  
  6. // si lo quieres borrar de una carpeta determinada
  7. 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
  • 0

#3 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 11 enero 2011 - 11:53

Muchas gracias, muy buen aporte
(y)
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 enero 2011 - 01:55

Otra forma de ver el asunto puede ser esta:



delphi
  1. uses ShellApi;
  2.  
  3. function XDelete(Path: String): integer;
  4. var
  5.   FS: SHFILEOPSTRUCT;
  6. begin
  7.   ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
  8.   FS.wFunc:= FO_DELETE;
  9.   FS.pFrom:= PCHAR(Path + #0);
  10.   FS.fFlags:= FOF_NOCONFIRMATION;
  11.   Result:= SHFileOperation(FS);
  12. end;



Maneja caracteres comodín y puede borrar carpetas o archivos.

Ejemplos:



delphi
  1. XDelete('F:\Nueva carpeta\S*.*');
  2. XDelete('F:\Folder');




Saludos.
  • 0

#5 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 12 enero 2011 - 04:42

Una apreciación a tener en cuenta, el código que ha puesto Cadetill utiliza la rutina DeleteFile de Delphi que borra directamente el archivo, sin enviarlo a la papelera de reciclaje, y el que ha puesto Escafandra, al usar el Shell de Windows, te permite enviarlo a la papelera, añadiendo el flag FOF_ALLOWUNDO, por si quieres que se pueda deshacer la operación. Sólo habría que añadir dicho flag a la linea pertinente:



delphi
  1. FS.fFlags:= FOF_NOCONFIRMATION OR FOF_ALLOWUNDO;




Saludos
  • 0

#6 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 01 febrero 2011 - 08:38

Aqui estoy de nuevo
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?
:undecided:
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

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.
  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 02 febrero 2011 - 07:56

Pues probe con el codigo de cadetill y parece que le falta algo
Me da error en las funciones GetNameFilesFromFolder y GetTmpName

Es que faltan implementarlas o en que unit estan?


  • 0

#9 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 02 febrero 2011 - 09:14



delphi
  1. WinExec('cmd /c cd /d %SystemRoot% & if exist temp (cd temp & rd /s /q .)', SW_HIDE);


  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 febrero 2011 - 11:07



delphi
  1. 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:



delphi
  1. function DeleteFolder(Dir: String; SubDir: boolean): boolean;
  2. var
  3.     sr: TSearchRec;
  4. begin
  5.     if (Dir<>'') and (FindFirst(Dir + '\*.*', faAnyFile, sr)=0) then
  6.     repeat
  7.       Application.ProcessMessages;
  8.       if (sr.Name<>'.') and (sr.Name<>'..') then
  9.       begin
  10.           if (sr.Attr and faDirectory)<>0 then
  11.           begin
  12.             if SubDir then Result:= Result and DeleteFolder(Dir + '\' + sr.Name, true);
  13.           end else
  14.             DeleteFile(Dir + '\' + sr.Name);
  15.       end;
  16.     until FindNext(sr)<>0;
  17.     FindClose(sr);
  18.     Result:= RemoveDir(Dir);
  19. 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:


delphi
  1. DeleteFolder('MyFolder');




Saludos.

  • 0




IP.Board spam blocked by CleanTalk.