En el
truco número 15 (sección de trucos del club) y en sus comentarios tienes una función que a partir de un directorio y de forma recursiva te rellena un TStrings con todos los nombres de ficheros. Supongo que si modificas los atributos, puedes conseguir que además almacene los nombres de los directorios.
Código Delphi
[-]
procedure FindFiles(StartDir, FileMask: string; recursively: boolean; var FilesList: TStringList)