Delphi: Buscando archivos

Buscando archivos

Copyright © 2000 Ernesto De Spirito

JfControls Library - para Delphi y C++ Builder

FindFirst, FindNext, FindClose

Para buscar ficheros que concuerden con una cierta especificación de nombre (como 'C:\WINDOWS\*.INI') usamos las funciones FindFirst y FindNext el procedimiento FindClose. Para que esto funcione, necesitamos un registro TSearchRec que entre otras cosas contiene información del fichero encontrado que coincide con el criterio de búsqueda. Se usa un código como el siguiente:

uses SysUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  SearchRec: TSearchRec;
begin
  if FindFirst('C:\WINDOWS\*.INI', faAnyFile and not
     (faVolumeID or faDirectory), SearchRec) = 0 then
  begin
    repeat
      // Aquí procesamos cada archivo encontrado
      // Sus datos se encuentran en SearchRec.
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
  end;
end;

Si FindFirst devuelve 0 significa que al menos se encontró un fichero coincidente con el criterio especificado. Luego usamos FindNext para obtener la información de los siguientes ficheros que cumplen el criterio de búsqueda uno por uno. FindNext también devuelve 0 si se encuentra un fichero. Después que hayamos procesado todos los ficheros debemos cerrar la búsqueda llamando a FindClose que libera algunos recursos en SearchRec asignados por FindFirst.

Si atributos es 0, FindFirst y luego FindNext encontrarán sólo ficheros normales, excluyendo los ficheros marcados con atributos de Archivo, Sólo Lectura, Oculto, Sistema, Directorio o Volumen. Para incluir estos ficheros en la búsqueda sumamos ("OReamos") sus constantes correspondientes: faArchive, faReadOnly, faHidden, faSysFile, faDirectory y faVolumeID .

Si necesita buscar archivos en un directorio y sus subdirectorios puede usar este ejemplo.

TSearchRec

Esta estructura (registro) contiene la información de un fichero encontrado por FindFirst o FindNext. El campo más importante es Name, una cadena que contiene el nombre largo del archivo encontrado, sin el camino.

type
TSearchRec = record
  Time: Integer;
  Size: Integer;
  Attr: Integer;
  Name: TFileName;
  ExcludeAttr: Integer;
  FindHandle: THandle;
  FindData: TWin32FindData; // Información adicional
end;

El campo Time es una estampa de fecha y hora de DOS y representa el momento de la última modificación realizada al archivo. Puede convertir este valor a un TDateTime usando la función FileDateToDateTime.

EurekaLog - Capture y registre cada excepción!