Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-11-2013
darkmir darkmir is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 28
Poder: 0
darkmir Va por buen camino
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:
#include <io.h> //las librerias que uso para listar los archivos
#include <fstream.h>

void listar()
{
struct _finddata_t arch;
long result;

AnsiString files = "E\\*.*";

if ((result = _findfirst(files.c_str(), &arch)) == -1L ) // si hay error que no busque nada
{
ListBox1->Items->Add(" No hay archivos para Desocultar ");
}
else
{
do
{
ListBox1->Items->Add(files);
}
while ( _findnext(result, &arch) == 0 ); // sigue buscando mientras no haya error
_findclose(result);
}

}
trate de ponerle un condicional, diciendole que si era carpeta que liste sus archivos y carpetas dentro de ella, pero solo serviria como segunda capa, si hay mas subcarpetas tendria que ponerle denuevo otra condicional y otra y otra.... estoy trantando de hacer un codigo el cual me liste las subcarpetas indefinidas y no solo la primera o segunda capa, ya que no sabremos cuantas subcarpetas pueden estar dentro de otra subcarpeta....

agradesco de antemano sus respueestas.

Saludos.
Responder Con Cita
  #2  
Antiguo 22-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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);
  };
}
Sin embargo, si estas usando C++ Builder, es mas simple hacer:
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);
  }
}
Ejemplo de uso para ambas funciones:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ListFiles("C:\\UNA_CARPETA", ListBox1);
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 22-11-2013
darkmir darkmir is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 28
Poder: 0
darkmir Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 22-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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);
¿ Cuál es exactamente el mensaje de error que te muestra ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 22-11-2013
darkmir darkmir is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 28
Poder: 0
darkmir Va por buen camino
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);



}
//---------------------------------------------------------------------------
lo queria unir así:

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);
  };
}
pero no me muestra nada, bueno lo queria unir, para separar directorios de archivos, y al final escoger cual listar, o bien directorios o bien archivos, algo así:

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.
Responder Con Cita
  #6  
Antiguo 22-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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 ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 20:45:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi