una trabajo tipos listas listar generador directorio dentro crear carpetas carpeta cambiar archivos c directory stat

trabajo - listar archivos dentro de un directorio o carpeta en c



Problemas para leer directorios en C (4)

Tengo una idea bastante buena de lo que está mal, pero primero quiero decirte cómo solucionar esto. Cambiar este código ...

if(stat(dirent -> d_name, &stat_info) == -1){ printf("readdir error for %s/n", dirent->d_name); exit(1); }

... para leer en su lugar ...

if (stat(dirent->d_name, &stat_info)) { printf("%s: %s/n", dirent->d_name, strerror(errno)); continue; }

Tendrá que agregar a la lista de inclusión

#include <errno.h>

Ejecuta el programa de nuevo. Si no ve en la salida cuál es el problema, edite la salida COMPLETA, NO EDITADA en su pregunta e iremos desde allí.

Estoy escribiendo un simple programa C que recibe un directorio como argumento y muestra los archivos en este directorio y también sus subdirectorios. Escribí una función "recursiva" para hacer eso. Pero por una razón desconocida, mi programa falla en la función stat . Aquí está mi programa:

#define _POSIX_SOURCE 1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> void display_directory(char* path){ DIR* directory = opendir(path); if( directory == NULL){ printf("opendir failure for %s/n", path); exit(1); } struct dirent* dirent; struct stat stat_info; while((dirent = readdir(directory)) != NULL){ printf("[%s]/n", dirent->d_name); if(stat(dirent -> d_name, &stat_info) == -1){ printf("readdir error for %s/n", dirent->d_name); exit(1); } if(S_ISREG(stat_info.st_mode)){ printf("File: %s /n", dirent -> d_name); } if(S_ISDIR(stat_info.st_mode)){ if(strncmp(dirent->d_name, "..",2)){ printf("Directory : %s/n", dirent->d_name); display_directory(dirent->d_name); } } } closedir(directory); } int main(int argc, char* argv[]){ char* path; if(argc > 1){ path = argv[1]; } else { path = "."; } display_directory(path); return EXIT_SUCCESS; }

Por ejemplo, si en mi directorio A, tengo a1, a2, a3 y .. , lee primero el directorio .. y cuando lee el directorio a1, la función stat falla.

¿Alguien puede decirme qué no es correcto con mi código?

[EDIT] <errno.h> como muchos de ustedes sugieren y después de ejecutar el programa, tengo el error Too many open files .

#define _POSIX_SOURCE 1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <errno.h> #include <sys/stat.h> #include <sys/types.h> void display_directory(char* path){ DIR* directory = opendir(path); if( directory == NULL){ printf("opendir failure for %s --> %s/n", path, strerror(errno)); exit(1); } struct dirent* dirent; struct stat stat_info; while((dirent = readdir(directory)) != NULL){ printf("[%s]/n", dirent->d_name); if(stat(dirent->d_name, &stat_info)){ printf("readdir error for %s ---> %s/n", dirent->d_name, strerror(errno)); continue; } if(S_ISREG(stat_info.st_mode)){ printf("Fichier : %s /n", dirent->d_name); } if(S_ISDIR(stat_info.st_mode)){ if(strncmp(dirent->d_name, "..",2)){ printf("Directory : %s/n", dirent->d_name); display_directory(dirent->d_name); } } } closedir(directory); } int main(int argc, char* argv[]){ char* path; if (argc > 2) { fprintf(stderr, "Usage: %s [directory]/n", argv[0]); exit(1); } path = argv[1]; display_directory(path); return EXIT_SUCCESS; }

El resultado del programa:

[..] [mykill.c] readdir error for mykill.c ---> No such file or directory [.] Directory : . [..] [.] Directory : . [..] [.] Directory : . [..] ... ... Directory : . opendir failure for . --> Too many open files

mykill.c es un archivo en el directorio que se pasó como un argumento.



if(S_ISDIR(stat_info.st_mode)){ if( !strcmp(dirent->d_name, ".")) continue; if( !strcmp(dirent->d_name, "..")) continue; printf("Directory : %s/n", dirent->d_name); display_directory(dirent->d_name); }


Está creando estadísticas solo con nombre de archivo (sin la ruta completa), agregue la ruta completa al nombre de archivo o cambie el directorio de trabajo antes de llamar a stat.