• Domingo 22 de Diciembre de 2024, 12:52

Autor Tema:  Recorrer El Arbol De Directorios En C  (Leído 4896 veces)

Qbyte

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Recorrer El Arbol De Directorios En C
« en: Domingo 5 de Diciembre de 2004, 18:59 »
0
Hola a todos, :comp:  estoi programando en c i me encuentro con un problemilla  <_< , nesecito poder recorrer el arbol de directorios con mi programa, por ejemplo para listar todas las carpetas de una unidad, pero no encuentro nada al respeto para poder empezar, alguien sabe k funciones debo usar? k librerias??
Muchas gracias de antemano .

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Recorrer El Arbol De Directorios En C
« Respuesta #1 en: Lunes 6 de Diciembre de 2004, 17:28 »
0
Hace una busqueda en el foro q yo puse un ejemplo de como hacerlo

Salu2!!!!!!!!!!!

Qbyte

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Recorrer El Arbol De Directorios En C
« Respuesta #2 en: Lunes 6 de Diciembre de 2004, 22:29 »
0
he visto que le contestaste a Ciber lep algo sobre como crear una carpeta, però yo lo que nesecito es poder passar de una carpeta a otra, saver quantas ay, que nombre tienen y supongo k komo los datos iran en una estructura la fecha de creación y eso ...
Supongo k tienen que haver alguna funcion para buscar carpetas en una unidad y poder acceder a ellas.
Por cierto este programa lo estoy escribiendo en C con el DevCpp  en consola para windows.
Gracias nicokiki, a ver si saves de alguna funcion k me pueda ayudar.
salu2!

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Recorrer El Arbol De Directorios En C
« Respuesta #3 en: Miércoles 8 de Diciembre de 2004, 17:34 »
0
Hola de nuevo!!!!!!!!!!!!

Te mando una clase que recorre un directorio (ya esta abierto el mismo con el codigo q mande antes). Tiene un par de cosas feas y cosas q hoy en dia sacaria pero bue, es lo q hay. Tener en cuenta q esto fue desarrollado bajo GNU/LINUX y q desconozco si en Windows las funciones son los mismas. Fijate q tomo la fecha de modificacion del archivo

Código: Text
  1.  
  2. #include "CDirectorio.h"
  3.  
  4. CDirectorio::CDirectorio()
  5. {
  6.   this->listaDeArchivos = new CListaDeArchivos;
  7. }
  8.  
  9. //******************************************************
  10. // Metodo que recorre el directorio indicado por el usuario
  11. // y llama al metodo getDatosArchivoYAgregarALista()
  12. //******************************************************
  13. TError CDirectorio::recorrerDirectorio(TString nombreDirectorio)
  14. {
  15.   struct dirent **listadeNombres;
  16.   TString nombreXML;
  17.  
  18.   //levanto los nombres en la ListadeNombres
  19.   long longitud = scandir(nombreDirectorio.c_str(), &listadeNombres, 0, alphasort);
  20.   //verifico si encontro alguno
  21.  
  22.   if (longitud < 0)
  23.   {
  24.     // Error al levantar los nombres de los archivos
  25.     return ERROR_DIRECTORIO;
  26.   }
  27.   else
  28.   {
  29.     long i = 0;
  30.     short largo = 0;
  31.     while(i < longitud)
  32.     {
  33.       // Tomo el nombre del archivo y exijo que termine en .XML/.xml y todas
  34.       // sus variaciones. Tampoco seran tenidos en cuenta archivos que contengan
  35.       // vocales con tilde o la "ENIE"
  36.       nombreXML = (const char*)listadeNombres[i]->d_name;
  37.       if (nombreXML != CONFIGURACION_XML)
  38.       {
  39.         largo = nombreXML.size() - 1;
  40.         if (((nombreXML[largo]   == 'L') || (nombreXML[largo]   == 'l')) &&
  41.             ((nombreXML[largo-1] == 'M') || (nombreXML[largo-1] == 'm')) &&
  42.             ((nombreXML[largo-2] == 'X') || (nombreXML[largo-2] == 'x')) &&
  43.             (nombreXML[largo-3] == '.'))
  44.         {
  45.           if (  (strchr((const char*)listadeNombres[i]->d_name,'ñ') == NULL) ||
  46.                 (strchr((const char*)listadeNombres[i]->d_name,'á') == NULL) ||
  47.                 (strchr((const char*)listadeNombres[i]->d_name,'é') == NULL) ||
  48.                 (strchr((const char*)listadeNombres[i]->d_name,'í') == NULL) ||
  49.                 (strchr((const char*)listadeNombres[i]->d_name,'ó') == NULL) ||
  50.                 (strchr((const char*)listadeNombres[i]->d_name,'ú') == NULL))
  51.           {
  52.             if (getDatosArchivoYAgregarALista((const char*)listadeNombres[i]->d_name, nombreDirectorio) == ERROR_DIRECTORIO)
  53.             {
  54.               free(listadeNombres);
  55.               return ERROR_BUSQUEDA_ARCHIVOS;
  56.             }
  57.           }
  58.         }
  59.         free(listadeNombres[i]);
  60.         i++;
  61.       } // Nombre distinto de configuracion.xml
  62.       else
  63.         i++;
  64.     }
  65.     free(listadeNombres);
  66.    }
  67.    return OK;
  68. }
  69.  
  70.  
  71. //******************************************************
  72. // Metodo que obtiene los datos del archivo cuyo nombre
  73. // es recibido por parametro. Los agrega a la lista
  74. //******************************************************
  75. TError CDirectorio::getDatosArchivoYAgregarALista(const char* nombreArchivo,
  76.                                                   TString directorio)
  77. {
  78.   TString strFecha;
  79.   struct stat estrStat;
  80.   CInfoDeArchivos infoArch;
  81.   CNodoListaArchivos nodo;
  82.  
  83.   TString strFileName;
  84.   strFileName = directorio.c_str() &#59;
  85.   strFileName += '/';
  86.   strFileName += nombreArchivo&#59;
  87.  
  88.   //Levanto los datos del archivo
  89.   int error = stat(strFileName.c_str() , &estrStat);
  90.  
  91.   // todo bien
  92.   if(error == 0)
  93.   {
  94.     // Si es un archivo regular => lo tomo, caso contario salteo directorios, sockets, ....
  95.     if (S_ISREG(estrStat.st_mode))
  96.     {
  97.        strFecha = ctime(&estrStat.st_mtime);
  98.        infoArch.setNombre(nombreArchivo);
  99.        infoArch.setFechaModificacion(strFecha);
  100.        // La 1era vez digo que la operacion es 'C' -> CREAR
  101.        nodo.setOperacion('C');
  102.        nodo.setInfoDeArchivo(infoArch);
  103.        listaDeArchivos->agregaNodoListaArchivos(nodo);
  104.     }
  105.   }
  106.   else
  107.   {
  108.     return ERROR_DIRECTORIO;
  109.   }
  110.   return OK;
  111. }
  112.  
  113. //******************************************************
  114. CListaDeArchivos& CDirectorio::getListaDeArchivos()
  115. {
  116.   return *listaDeArchivos;
  117. }
  118.  
  119. CDirectorio::~CDirectorio()
  120. {
  121.   if (this->listaDeArchivos != NULL)
  122.     delete this->listaDeArchivos;
  123. }
  124.  
  125.  


Espero q sirva de algo

Salu2!!!!!!!!!!!!!!

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Recorrer El Arbol De Directorios En C
« Respuesta #4 en: Sábado 18 de Diciembre de 2004, 22:49 »
0
Hola.

En el link que aparece en este post:
http://foros.solocodigo.com/index.php?showtopic=5441&hl=
hay un código para Windows que va leyendo el contenido de cada directorio y mostrandolo por pantalla, y detecta qué entradas son directorios y entra recursivamente en ellas.

Un saludo.

Ruben3d