Me ha costado trabajo pero al final ha salido funcionando.

Por necesidades del guión (es la excusa que las actrices recatadas ponían cuando debían aparecer desnudas en un film) por necesidades del guión, decía, tengo que recorrerme todo un árbol de directorios y subdirectorios extrayendo solo una serie o tipo de ficheros de texto para tratarlos y revisarlos separadamente, uno a uno.
Empecé con los dos primeros ficheros haciéndolo a mano y tardé un buen rato en hacerlo ... y la lista incluye varios cientos de ficheros. Ante tal enormidad, podía tardar meses en repasar todos y cada uno de esos ficheros, y sabiendo que no soy mal programador me decidí por hacerme un "repasador" automático que realice lo que a mi me costaría sangre, sudor y lágrimas.
Antes de desarrollar las interioridades de la labor que tengo que realizar, como paso previo, necesitaba una pequeña herramienta que fuese capaz de seleccionar todos y cada uno de los ficheros de un tipo determinado y hacer una lista con ellos, su path + file_name + file_extension, para poder tratarlos posteriormente uno a uno.
Este trabajo previo es el que os presento aquí.
Se trata de un pequeño programa que dado un directorio inicial y un file_extension rellena un TListBox con todos los ficheros de ese tipo que se encuentren en ese directorio y si está marcado un Checkbox lista también todos los subdirectorios que aquél tenga. Accesoriamente también rellena otro TListbox con los nombre de aquellos directorios que va recorriendo.
La función principal, llamada Execute, es llamada de forma recursiva cada vez que se encuentra un directorio dentro del que está tratando en ese momento. Este es el quid del programa y la parte sencilla a la par que elegante de la que me siento orgulloso de mostraros.
Esta es la función a la que me refiero, el resto es lo justo para poder llamarla:
procedure TFrmMain.Execute(filespec: string; mask: string; recursive: boolean);
var
sr : TSearchRec;
path,tmp : string;
FFileAttrs: TFileAttribs;
begin
FFileAttrs := [];
filespec := filespec + chr(92) + mask;
path := ExtractFilePath(filespec);
{ 1ª fase : Añade los ficheros del directorio }
if FindFirst( filespec , AttrToInt(fFileAttrs), sr) = 0 then
begin
{ Añado el primer fichero }
ListResults.Items.Add(path+sr.FindData.cFileName);
{ Añado el resto de ficheros }
while FindNext(sr) = 0 do
begin
ListResults.Items.Add(path+sr.FindData.cFileName);
end;
FindClose(sr);
end;
{ 2ª fase : Trata los directorios si hay recursividad }
if recursive and (FindFirst( path+'*.*' , Sysutils.faDirectory, sr) = 0) then
begin
{ Re-trato el primer subdirectorio }
if recursive and ((sr.Attr and sysutils.faDirectory)<>0) and (sr.Name<>'.') and (sr.Name<>'..') then
begin
tmp := path + sr.FindData.cFileName;
ListDirs.Items.Add(tmp);
Execute(tmp , mask,recursive);
end;
{ Re-trato el resto de subdirectorios }
while FindNext(sr) = 0 do
begin
if recursive and ((sr.Attr and sysutils.faDirectory)<>0) and (sr.Name<>'.') and (sr.Name<>'..') then
begin
tmp := path + sr.Name;
ListDirs.Items.Add(tmp);
Execute(tmp , mask ,recursive);
end;
end;
FindClose(sr);
end;
end;
Una imagen del programa funcionando es ésta, en ella se puede ver cómo he extraído todos los ficheros de tipo PHP que hay en el directorio (sed pacientes si tarda en cargar) :

Bueno y por último aquí tenéis el Proyecto dw.dpr para Delphi 6 Enterprise por si os sirve para algo:
descargarQue os aproveche, y hasta otro día.
