Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DrKillador en 6 Febrero 2013, 13:53 pm



Título: Listar directorio en c
Publicado por: DrKillador en 6 Febrero 2013, 13:53 pm
Hola amigos,

Saben como puedo hacer para listar un dir en C? y devolver una list con los archivos y subcarpetas que contenga el directorio?

Graxx  :D


Título: Re: Listar directorio en c
Publicado por: 0xDani en 6 Febrero 2013, 14:25 pm
Ejemplo usando POSIX:

Código
  1. #include <dirent.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6. DIR *d = opendir(".");
  7. struct dirent *dentry;
  8. size_t i=1;
  9.  
  10. while((dentry=readdir(d)!=NULL))
  11. {
  12.  printf("%u. %s\n", i, dentry->d_name);
  13. }
  14.  
  15. return 0;
  16. }
  17.  

No lo he probado, pero creo que funcionara. Este ejemplo debe listar los archivos y directorios del directorio actual (".").

Si es para windows no te puedo ayudar.

Saludos.


Título: Re: Listar directorio en c
Publicado por: DrKillador en 6 Febrero 2013, 14:29 pm
Gracias! Se me olvido ponerlo, sorry bro, es para windows  :rolleyes:


Título: Re: Listar directorio en c
Publicado por: Lambda en 6 Febrero 2013, 14:30 pm
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx

Con esas 2 funciones tienes para empezar


Título: Re: Listar directorio en c
Publicado por: amchacon en 6 Febrero 2013, 15:38 pm
Código
  1. void listarDirectorio(string Cosa)
  2. {
  3.    // Variables del sistema
  4.  
  5.    WIN32_FIND_DATA findFileData;
  6.    HANDLE          hFind;
  7.  
  8.    // Iniciamos la busqueda y le pasamos un valor a nuestro Handle
  9.  
  10.    hFind = FindFirstFile(Cosa.c_str(), &findFileData);
  11.  
  12.    // Si no existe la carpeta
  13.  
  14.    if (hFind == INVALID_HANDLE_VALUE)
  15.    {
  16.        std::cout << "La carpeta no existe o no se puede acceder";
  17.    }
  18.  
  19.    else
  20.    {
  21.        // Si existe, pasamos al siguiente fichero (el primero solo contiene basura)
  22.  
  23.        FindNextFile(hFind, &findFileData);
  24.  
  25.        // Listamos todos los ficheros restantes
  26.  
  27.        while (FindNextFile(hFind, &findFileData) != 0)
  28.        {
  29.            Buffer = Cosa; // Creamos una variable de nombre con el valor del directorio
  30.            Buffer.erase(Buffer.size()-1); // Borramos el asterisco
  31.            Buffer += findFileData.cFileName;
  32.  
  33.            if (GetFileAttributes(Buffer.c_str()) == FILE_ATTRIBUTE_DIRECTORY)
  34.            {
  35.                Buffer += "\\*";
  36.                listarDirectorio(Buffer);
  37.            }
  38.            else
  39.            {
  40.                std::cout<<Buffer<<endl;
  41.            }
  42.        }
  43.    }
  44. }

Es importante que le pases a la función la ruta "*" para que te marque la carpeta actual.


Título: Re: Listar directorio en c
Publicado por: DrKillador en 7 Febrero 2013, 08:35 am
Gracias @amchacon, una pregunta del código, en el IF situado dentro del WHILE, si la sentencia es verdadera intenta hacer recursividad, llamando de nuevo a la función listarDirectorio, pero a esta función se le pasan 2 argumentos, cuando en realidad solo admite uno por cabecera:

Código:
listarDirectorio(Buffer,Nuevo);
Código:
void listarDirectorio(string Cosa)

¿Está bien así?


Título: Re: Listar directorio en c
Publicado por: DrKillador en 7 Febrero 2013, 11:55 am
A ver si me pueden ayudar, he programado el siguiente codigo para listar todos los archivos y subcarpetas de una carpeta, pero me muestra UN SOLO archivo de la carpeta, el primero concretamente.

Saben que me puede estar fallando? Gracias a to2

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <tchar.h>
  5.  
  6. int main()
  7. {
  8.    WIN32_FIND_DATA findFileData;
  9.    HANDLE hFind;
  10.  
  11.    hFind = FindFirstFile(".", &findFileData);
  12.  
  13.    if(hFind==INVALID_HANDLE_VALUE)
  14.    {
  15.        printf("La carpeta no existe o no se puede acceder");
  16.    }
  17.    else
  18.    {
  19.        do
  20.        {
  21.            if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
  22.            {
  23.                printf("Dir %s",findFileData.cFileName);
  24.            }
  25.            else
  26.            {
  27.                printf("%s\n",findFileData.cFileName);
  28.            }
  29.        }while(FindNextFile(hFind,&findFileData)!=0);
  30.  
  31.        FindClose(hFind);
  32.    }
  33.  
  34.    return 0;
  35. }


Título: Re: Listar directorio en c
Publicado por: amchacon en 7 Febrero 2013, 12:24 pm
Culpa mia, he cometido dos fallos:


- Lo de poner la funcion recursiva con dos parametros.
- Es un * para listar el directorio actual y no un punto.


Título: Re: Listar directorio en c
Publicado por: DrKillador en 7 Febrero 2013, 13:18 pm
Arreglado, era el * efectivamente. Ya podéis cerrar el hilo, muchas gracias!


Título: Re: Listar directorio en c
Publicado por: amchacon en 7 Febrero 2013, 14:43 pm
Aclaro un poco lo de *

Hay que poner * para acceder al contenido de una carpeta, de lo contrario lo unico que accederemos es a la carpeta en sí (podríamos checkear sus propiedades, sus características... etc).