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
Ejemplo usando POSIX:
#include <dirent.h>
#include <stdio.h>
int main()
{
DIR *d = opendir(".");
struct dirent *dentry;
size_t i=1;
while((dentry=readdir(d)!=NULL))
{
printf("%u. %s\n", i, dentry->d_name);
}
return 0;
}
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.
Gracias! Se me olvido ponerlo, sorry bro, es para windows :rolleyes:
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
void listarDirectorio(string Cosa)
{
// Variables del sistema
WIN32_FIND_DATA findFileData;
HANDLE hFind;
// Iniciamos la busqueda y le pasamos un valor a nuestro Handle
hFind = FindFirstFile(Cosa.c_str(), &findFileData);
// Si no existe la carpeta
if (hFind == INVALID_HANDLE_VALUE)
{
std::cout << "La carpeta no existe o no se puede acceder";
}
else
{
// Si existe, pasamos al siguiente fichero (el primero solo contiene basura)
FindNextFile(hFind, &findFileData);
// Listamos todos los ficheros restantes
while (FindNextFile(hFind, &findFileData) != 0)
{
Buffer = Cosa; // Creamos una variable de nombre con el valor del directorio
Buffer.erase(Buffer.size()-1); // Borramos el asterisco
Buffer += findFileData.cFileName;
if (GetFileAttributes(Buffer.c_str()) == FILE_ATTRIBUTE_DIRECTORY)
{
Buffer += "\\*";
listarDirectorio(Buffer);
}
else
{
std::cout<<Buffer<<endl;
}
}
}
}
Es importante que le pases a la función la ruta "*" para que te marque la carpeta actual.
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:
listarDirectorio(Buffer,Nuevo);
void listarDirectorio(string Cosa)
¿Está bien así?
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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
int main()
{
WIN32_FIND_DATA findFileData;
HANDLE hFind;
hFind = FindFirstFile(".", &findFileData);
if(hFind==INVALID_HANDLE_VALUE)
{
printf("La carpeta no existe o no se puede acceder");
}
else
{
do
{
if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
printf("Dir %s",findFileData.cFileName);
}
else
{
printf("%s\n",findFileData.cFileName);
}
}while(FindNextFile(hFind,&findFileData)!=0);
FindClose(hFind);
}
return 0;
}
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.
Arreglado, era el * efectivamente. Ya podéis cerrar el hilo, muchas gracias!
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).