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.
Use nftw()
.
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.