Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como borrar los archivos de la carpeta Windows\Temp\ (https://www.clubdelphi.com/foros/showthread.php?t=72165)

JoAnCa 01-02-2011 16:05:02

Como borrar los archivos de la carpeta Windows\Temp\
 
Hola a todos
estoy haciendo un sencillo soft para borrar el contenido de la carpeta Windows\Temp\ pero sucede que cuando hay un archivo en uso, da error y aborta la operacion
Lo que necesito es la forma de que si esto sucede, ignore el archivo en uso y continue borrando el siguiente, sin abortar la operación

el codigo que uso para esto es un aporte de escafandra en DA

Código Delphi [-]
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;

Código Delphi [-]
XDelete('C:\Windows\Temp\*.*');

Neftali [Germán.Estévez] 01-02-2011 17:54:43

A mi me funciona algo como esto (además puedes hacerlo recursivo):

Código Delphi [-]
var
  TS:TStringList;
  i:Integer;
begin

  try
    TS := TStringList.Create();
    FindFiles('c:\windows\temp', '*.*', True, TS);
    for i := 0 to (TS.Count - 1) do begin
      DeleteFile(TS[i]);
    end;
  finally
    FreeAndNil(TS);
  end;

La función FindFiles se puede encontrar en la sección de trucos del club.

Código Delphi [-]
procedure FindFiles(StartDir, FileMask: string; recursively: boolean; var FilesList: TStringList);
var
  SR: TSearchRec;
  DirList: TStringList;
  IsFound: Boolean;
  i: integer;
const
  CHAR_BACKSLASH = '\';
  MASK_ALL_FILES = '*.*';
  CHAR_POINT = '.';
begin
  if (StartDir[length(StartDir)] <> CHAR_BACKSLASH) then begin
    StartDir := StartDir + CHAR_BACKSLASH;
  end;

  // Crear la lista de ficheos en el directorio StartDir (no directorios!)
  IsFound := FindFirst(StartDir + FileMask, faAnyFile - faDirectory, SR) = 0;
  // MIentras encuentre
  while IsFound do  begin
    FilesList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;

  FindClose(SR);

  // Recursivo?
  if (recursively) then begin
    // Build a list of subdirectories
    DirList := TStringList.Create;
    // proteccion
    try
      IsFound := FindFirst(StartDir + MASK_ALL_FILES, faAnyFile, SR) = 0;
      while IsFound do
      begin
        if ((SR.Attr and faDirectory) <> 0) and
          (SR.Name[1] <> CHAR_POINT) then
          DirList.Add(StartDir + SR.Name);
        IsFound := FindNext(SR) = 0;
      end;
      FindClose(SR);

      // Scan the list of subdirectories
      for i := 0 to DirList.Count - 1 do
        FindFiles(DirList[i], FileMask, recursively, FilesList);
    finally
      DirList.Free;
    end;
  end;
end;

JoAnCa 02-02-2011 14:54:36

Hola neftali
Probe tu codigo y no me funciona como esperaba, pues no me elimina algunos archivos que no estan en uso
Me doy cuenta de eso porque despues de ejecutar el programa trate de eliminar manualmente los que dejó y se eliminaron sin dar error

Tambien pase el StringList para un ListBox para ver que archivos almacena para borrar y hay archivos en la lista que no borra, tampoco la mayoria de las carpetas (que no estan en uso porque se borraron manualmente bien)

No se si es que no esta siendo recursivo, o que sucede :confused:

Neftali [Germán.Estévez] 02-02-2011 16:09:04

Cita:

Empezado por JoAnCa (Mensaje 389672)
Probe tu codigo y no me funciona como esperaba, pues no me elimina algunos archivos que no estan en uso

¿Tienen algo de especial esos archivos?
Yo lo he probado y me funciona perfectamente (excepto con los que están en uso y los que están en ReadOnly).
¿Puede ser por algo relacionado con los atributos?

mightydragonlor 02-02-2011 16:44:55

debe ser que el antivisrus trabaja de fondo escaneando, cuando esto pasa mantiene un par de archivos en temp, el problema es que al estar abiertos no se pueden borrar, la mejor opcion sería borar uno a uno, si no puede hacerlo que lo ignore, osea, poner el try dentro del for.


La franja horaria es GMT +2. Ahora son las 10:32:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi