Obtener ruta y nombre de archivo de todos los archivos en un directorio dado y sus subdirecciones
-
19-08-2019 - |
Pregunta
Me dieron este código hace un tiempo. Finalmente pude probarlo (con algunos cambios para colocar los archivos en un lugar diferente) ...
void AddFiles(AnsiString path/*, TDataSet *DataSet*/)
{
TSearchRec sr;
int f;
f = FindFirst(path+"\\*.*", faAnyFile, sr);
while( !f )
{
if(sr.Attr & faDirectory)
{
if(sr.Name != "." && sr.Name != "..")
{
path.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(path/*, DataSet*/);
}
}
else
{
Form1->ListBox1->Items->Add(path+ "\\"+ sr.Name);
//DataSet->Append();
//DataSet->FieldByName("Name")->Value = sr.Name;
/* other fields ... */
//DataSet->Post();
}
f = FindNext(sr);
}
FindClose(sr);
}
No funciona correctamente. Al principio se mezcla ...
una estructura real de ...
raíz root \ subdir1 root \ subdir2 root \ subdir3
se arruina así ...
raíz root \ subdir1 root \ subdir1 \ subdir2 root \ subdir1 \ subdir2 \ subdir3
y finalmente deja de incluir las carpetas raíz o sub \ sub y la 'ruta' solo contiene una subcarpeta (sin sus carpetas raíz)
esto es completamente inútil para obtener nombres de archivo de ruta completa utilizables.
así que o puedes decirme dónde va mal el código ... o dame algunos consejos sobre cómo obtener los nombres de archivo de ruta completa en un directorio y todo sus subdires.
Quiero que sea lo más básico posible. es decir, no hay características avanzadas de C ++ poco comunes. cosas que un constructor novato probablemente pueda depurar.
Solución
Aquí agrega cada subruta a la ruta actual:
path.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(path/*, DataSet*/);
Use una nueva variable para la ruta combinada, para no estropear la variable ruta
que todavía necesita para el resto de los archivos / directorios en el directorio:
AnsiString subpath;
subpath.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(subpath/*, DataSet*/);