FindFirst, FindNext, FindClose, TSearchRec

Con estas dos funciones (FindFirst y FindNext) podremos recorrer una carpeta y buscar ficheros según sus atributos y según un filtro dado (comodines).

La función FindFirst, con la siguiente sintaxis: FindFirst(carpeta+filtro, tipo_fichero, TSearchRec) devolverá TRUE si encuentra algún fichero con el filtro indicado y el tipo de fichero (atributos) indicado, devolverá en el componente TSearchRec los datos del fichero encontrado.

La función FindNext, con la sintaxis: FindNext(TSearchRec) devolverá la siguiente coincidencia del componente TSearchRec pasado como parámetro, devolverá el siguiente fichero que cumpla la condición de búsqueda establecida en FindFirst. Cuando no encuentre más resultados devolverá 0.

La función FindClose, con la sintaxis: FindClose(TSearchRec) libera la memoria asignada por FindFirst en el TSearchRec.

El tipo TSearchRec define la información obtenida por FindFirst ó FindNext. Este tipo pertenece la la unidad SysUtils y su declaración es la siguiente:

TSearchRec = record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;

donde Attr equivale al atributo, cuyo valor entero equivale a los siguientes atributos:

faReadOnly $00000001 Read-only files
faHidden $00000002 Hidden files
faSysFile $00000004 System files
faVolumeID $00000008 Volume ID files
faDirectory $00000010 Directory files
faArchive $00000020 Archive files
faAnyFile $0000003F Any file

Un ejemplo de uso de estas funciones y del tipo TSearchRec:

procedure TformMenuPrincipal.copiaFicheros (carpetaOrigen, 
    carpetaDestino, filtro : string;
    reemplazarFicheros : boolean; tipoLog : string);
var
  compBusqueda : TSearchRec;
begin
  carpetaOrigen := 
      IncludeTrailingBackslash(carpetaOrigen);
  carpetaDestino := 
      IncludeTrailingBackslash(carpetaDestino);
  ForceDirectories(carpetaDestino);

  if FindFirst(carpetaOrigen + filtro, 
      faAnyFile, compBusqueda) = 0 then
  begin
    repeat
      if (compBusqueda.Name <> '.') and 
          (compBusqueda.Name <> '..') then
        if (compBusqueda.Attr and faDirectory) > 0 then
          copiaFicheros(carpetaOrigen + 
              compBusqueda.Name,
              carpetaDestino + compBusqueda.Name, filtro,
              reemplazarFicheros, tipoLog)
        else
        begin
          lInfo.Caption := 'Copiando ' +
              carpetaOrigen + compBusqueda.Name;
          lInfo.Refresh;
          Application.ProcessMessages;
          if CopyFile(Pchar(carpetaOrigen + 
              compBusqueda.Name),
              PChar(carpetaDestino + compBusqueda.Name), 
              reemplazarFicheros) then
            numFicherosCopiados := numFicherosCopiados + 1;
          else
            numFicherosNoCopiados := numFicherosNoCopiados + 1;                
        end;
    until FindNext(compBusqueda) <> 0;
    FindClose(compBusqueda);
  end;
end;

Este ejemplo se puede utilizar para realizar una copia de una carpeta y todas sus subcarpetas en otra.

alonsojpd

alonsojpd

Presidente y fundador de Proyecto A y AjpdSoft

Deja un comentario