Buscar ficheros en un directorio y guardarlos en un TStringList (recursico)

Función para buscar ficheros en un directorio de forma recursiva.
Devuelve una lista de nombres de fichero encontrados a partir de la carpeta inicial StartDir, que cumplen el patrón especificado por FileMask.

Mediante recursively se indica si se desea
hacer la busqueda en los subdirectorios.

El resultado se devuelve en FilesList (TStringList), que es la lista que se rellena con los nombres de fichero encontrados.

{: Devuelve una lista de nombres de fichero encontrados a partir 
de la carpeta inicial StartDir, que cumplen el patrón especificado 
por FileMask.Mediante recursively se indica si se desea hacer la
 busqueda en los subdirectorios.
StartDir Carpeta desde la que empezar a buscar.
FileMask Patrón que han de cumplir los ficheros.
Recursively Si hay que continuar la búsqueda en los subdirectorios.
FilesList Lista con los nombres de fichero encontrados.
}
procedure FindFiles(StartDir, FileMask: string; 
                 recursively: boolean; var FilesList: TStringList);
const
  MASK_ALL_FILES = '*.*';
  CHAR_POINT = '.';
var
  SR: TSearchRec;
  DirList: TStringList;
  IsFound: Boolean;
  i: integer;
begin

  if (StartDir[length(StartDir)] <> '\') then begin
    StartDir := StartDir + '\';
  end;

  // Crear la lista de ficheos en el dir. 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 begin
        DirList.Add(StartDir + SR.Name);
        IsFound := FindNext(SR) = 0;
      end; // if
    end; // while
    FindClose(SR);
    // Scan the list of subdirectories
    for i := 0 to DirList.Count - 1 do begin
      FindFiles(DirList[i], FileMask, recursively, FilesList);
    end;

    finally
      DirList.Free;
    end;
  end;
end;

4 de comentarios

  1. MOLE dice:

    Creo que esta equivocado el codigo
    while IsFound do begin
    if ((SR.Attr and faDirectory) 0) and
    (SR.Name[1] CHAR_POINT) then begin
    DirList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
    end; // if
    end; // while

    deberia ser:

    while IsFound do begin
    if ((SR.Attr and faDirectory) 0) and
    (SR.Name[1] CHAR_POINT) then begin
    DirList.Add(StartDir + SR.Name);
    // IsFound := FindNext(SR) = 0;
    end; // if
    IsFound := FindNext(SR) = 0;
    end; // while

    14 mayo 2010
  2. @MOLE
    Gracias Mole por el comentario.
    Lo tendré en cuenta y lo revisaré.

    28 mayo 2010
  3. ISEKO dice:

    El codigo listado esta bien.

    23 marzo 2015
  4. ReySS dice:

    Saludos en el 2020…@MOLE lleva razón…dicha línea debe ir fuera del if…gracias por el código funciona muy bien en Delphi 10.1.

    5 abril 2020

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *