Ver Mensaje Individual
  #1  
Antiguo 05-11-2012
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Reputación: 21
lbidi Va por buen camino
Borrar archivos segun fecha y la carpeta si esta vacia

Estimados foristas.

Deseo recorrer una carpeta y sus subcarpetas buscando archivos que sean menores a 30 dias a la fecha
y si es asi, borrarlos. A su vez, si la carpeta queda vacia, tambien borrarla.

He tomado el siguiente codigo de varios posts pero no he logrado el objetivo. En algun punto creo
que queda en loop infinito o no me borra ni los archivos ni las carpetas.

Código Delphi [-]
var
    sRuta : string;
    bIncluirSubdirectorios : Boolean;

//_________________________________________________
function GetFileDateTime(Nombre: string): TDateTime;
var
Hnd: integer;
begin
    Hnd := FileOpen(Nombre, 0);
    try
      Result:= FileDateToDateTime(FileGetDate(Hnd));
    finally
      FileClose(Hnd);
    end;
end;

//_____________________________________________________________
procedure RecorrerDirectorio( sRuta: String; bIncluirSubdirectorios: Boolean );
var
   cDir, Directorio : TSearchRec;
   iResultado : Integer;
   dt: TDateTime;

begin

    // Si la ruta no termina en contrabarra se la ponemos
    if sRuta[Length(sRuta)] <> '\' then
        sRuta := sRuta + '\';

    iResultado := FindFirst( sRuta + '*.*', FaAnyfile, Directorio );
    while iResultado = 0 do
    begin
        // ¿Es un directorio y hay que entrar en él?
        if ( Directorio.Attr and faDirectory = faDirectory ) and bIncluirSubdirectorios then
        begin
        if ( Directorio.Name <> '.' ) and ( Directorio.Name <> '..' ) then
            RecorrerDirectorio( sRuta + Directorio.Name, True );
        end
        else
        begin
          // ¿No es el nombre de una unidad ni un directorio?
            if ( Directorio.Attr and faVolumeId <> faVolumeID ) then
            begin
              dt := GetFileDateTime( sRuta + Directorio.Name);
              if DaysBetween(dt, Now) > 30 then
                  DeleteFile( sRuta + Directorio.Name );
              if FindFirst( Directorio.Name + '*.*', FaAnyfile, cDir ) = 0 then
                 RemoveDir( sRuta + Directorio.Name );
            end;
        end;

        iResultado := FindNext( Directorio );

    end;

    SysUtils.FindClose( Directorio );

end;

begin
    sRuta := 'T:\VIDEOS';
    bIncluirSubdirectorios := True;
    RecorrerDirectorio( sRuta, True );
end.

Agradezco mucho la ayuda prestada en resolver este "misterio" ( al menos para mi ).

Saludos

Leonardo
Responder Con Cita