FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Listar carpetas y subcarpetas
Hola a todos, trato de listar archivos, carpetas y subcarpetas en un ListBox, pero solo llego a listar archivos y carpetas de la primera capa, osea no me lista los archivos que estan dentro de otras carpetas:
mi codigo es el siguiente: Cita:
agradesco de antemano sus respueestas. Saludos. |
#2
|
||||
|
||||
Hola darkmir.
La forma mas simple de concebir el algoritmo es de forma recursiva: Código:
#include <io.h> #include <dir.h> void ListFiles(char *Dir, TListBox *LB) { struct _finddata_t fdt; long hFile; char tmp[MAX_PATH]; chdir(Dir); fdt.attrib = _A_SUBDIR; if( (hFile = _findfirst("*.*", &fdt) ) != -1) { do { if (fdt.attrib == _A_SUBDIR) { if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) { strcpy(tmp, Dir); strcat(tmp, "\\"); strcat(tmp, fdt.name); ListFiles(tmp, LB); } } else LB->Items->Add(String(fdt.name)); } while (_findnext(hFile, &fdt) == 0); _findclose(hFile); }; } Código:
void ListFiles(AnsiString Dir, TListBox *LB) { TSearchRec sr; ChDir(Dir); if (FindFirst("*.*", faDirectory, sr) == 0) { do { if (sr.Attr == faDirectory) { if (sr.Name != "." && sr.Name != "..") ListFiles(Dir + "\\" + sr.Name, LB); } else LB->Items->Add(sr.Name); } while (FindNext(sr) == 0); FindClose(sr); } } Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { ListFiles("C:\\UNA_CARPETA", ListBox1); }
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Gracias, me funciono bien.
Gracias ecfisa,
el codigo hace justo lo que necesitaba, mi unico inconveniente es que ambos codigos me leen sin problemas cuando pongo una unidad (E:\\), pero cuando pongo (E:\\LOGS\\) osea una unidad + "cualquier carpeta", me manda un error y no termina mi programa, lo solucione con un try{}catch(...){} cuando llamo la función, pero tratare de arreglarlo sin necesidad de un try-catch, veo que podria ser algun problema al momento de leer alguna carpeta especifica dentro de una unidad y como hay otras carpetas genera ese error, pero en fin es lo de menos. Te agradesco por la ayuda. |
#4
|
||||
|
||||
Hola darkmir.
La verdad no me explico ese comportamiento... Probé ambos códigos usando sólo la unidad, una carpeta, una carpeta y subcarpeta y funciona correctamente, como ejemplo: Código:
ListFiles("C:\\WINDOWS\\FONTS\\", ListBox1); Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#5
|
|||
|
|||
Hola ecfisa,
bueno , en si, no me manda ningún mensaje de error, pero se cuelga y se cierra el programa, me he dado cuenta que es con carpetas que tienen bastantes archivos, por ejemplo lo hice con "F:\\DOCUMENTOS\\" y ahi sale se cuelga, tengo algo de 400 gb de contenido, lo depure para ver el error y sale esto: pero lo arregle con try catch, ahora no me sale error, pero me parece que fuera por los atributos porque solo me pasa con esa carpeta y con la carpeta "C:\\windows\\", con otras carpetas corre sin problemas. Otra consulta, quise hacerlo en uno solo la funcion y la llamada pero no me sale exactamente como los anteriores codigos, como por ejemplo,unir en uno solo este código el cual me proporcionaste: Código:
void ListFiles(char *Dir, TListBox *LB) { struct _finddata_t fdt; long hFile; char tmp[MAX_PATH]; chdir(Dir); fdt.attrib = _A_SUBDIR; if( (hFile = _findfirst("*.*", &fdt) ) != -1) { do { if (fdt.attrib == _A_SUBDIR) { if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) { strcpy(tmp, Dir); strcat(tmp, "\\"); strcat(tmp, fdt.name); ListFiles(tmp, LB); } } else LB->Items->Add(String(fdt.name)); } while (_findnext(hFile, &fdt) == 0); _findclose(hFile); }; } ///////////////////////////////////////////////////////// void __fastcall TForm1::Button1Click(TObject *Sender) { ListFiles("F:\\", ListBox1); } //--------------------------------------------------------------------------- Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { char *Dir = "F:\\"; struct _finddata_t fdt; long hFile; char tmp[MAX_PATH]; chdir(Dir); fdt.attrib = _A_SUBDIR; if( (hFile = _findfirst("*.*", &fdt) ) != -1) { do { if (fdt.attrib == _A_SUBDIR) { if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) { strcpy(tmp, Dir); strcat(tmp, "\\"); strcat(tmp, fdt.name); // ListFiles(tmp, LB); } } else ListBox1->Items->Add(fdt.name); // para escoger que listar, archivos o carpetas. } while (_findnext(hFile, &fdt) == 0); _findclose(hFile); }; } ListBox1->Items->Add(fdt.name); // archivos ListBox1->Items->Add(Dir); // Directorios. si puedes ayudarme seria estupendo, igual, si me sale el código, lo estare comentando por acá. Gracias y Saludos. |
#6
|
||||
|
||||
Hola darkmir.
Tratándose de tantos directorios y archivos, seguramente la profundidad (cantidad de carpetas/subcarpetas hasta el nodo) sea muy grande y por tanto las llamadas recursivas del algoritmo agoten la memoria destinada a la pila. Al usar try/catch evitas que se lance la excepción, pero lamentablemente no va a cumplir el cometido. En este caso creo que hay que descartar la solución recursiva... Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Obtener los nombres de las subcarpetas de una carpeta | ingabraham | Varios | 2 | 01-06-2013 06:49:24 |
listar carpetas de un directorio? | gabrielflowers | PHP | 13 | 10-04-2008 00:25:22 |
Es posible compartir carpetas por Internet utilizando compartir carpetas? | JuanErasmo | Windows | 5 | 12-02-2007 20:45:17 |
listar archivos jpg dentro de una carpeta con subcarpetas | JuanErasmo | API de Windows | 6 | 06-12-2006 22:52:49 |
Buscar archivos jpg en carpetas y subcarpetas!! | JuanErasmo | API de Windows | 4 | 23-11-2006 17:41:49 |
|