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 luista 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 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;