En cuanto a la comprobación de archivo o directorio

Tengo un progtwig muy simple aquí, pero parece estar devolviendo un valor “verdadero” a la consulta S_ISDIR () incluso cuando la entrada del directorio no es un directorio. ¿Puede alguien ayudarme? Estoy usando QNX Neurtion RTOS

#include  #include  #include  #include  int main(int argc, char *argv[]) { DIR *dir; struct dirent *entry; struct stat eStat; char *root; int i; root = argv[1]; while((entry = readdir(dir)) != NULL) { lstat(entry->d_name, &eStat); if(S_ISDIR(eStat.st_mode)) printf("found directory %s\n", entry->d_name); else printf("not a dir\n"); } return 0; } 

salida de muestra:

 found directory . found directory .. found directory NCURSES-Programming-HOWTO-html.tar.gz found directory ncurses_programs found directory ncurses.html 

La siguiente información puede ser útil. lstat para el archivo está fallando con errno configurado en 2. No estoy seguro de por qué, ¿alguien puede saber esto?

Solo una suposición; Ya que no está buscando un error después de su llamada lstat, el búfer eStat podría contener el resultado de la última llamada exitosa. Intenta verificar si lstat devuelve -1.

readdir () en Linux es fundamentalmente diferente, por lo que no puedo realizar una prueba completa en mi sistema. Ver los progtwigs de ejemplo en el texto del enlace y el texto del enlace . Modificando el código de ejemplo lstat, esto parece funcionar para mí:

 #include  #include  #include  #include  int main( int argc, char **argv ) { int ecode = 0; int n; struct stat sbuf; for( n = 1; n < argc; ++n ) { if( lstat( argv[n], &sbuf ) == -1 ) { perror( argv[n] ); ecode++; } else if( S_ISDIR( sbuf.st_mode ) ) { printf( "%s is a dir\n", argv[n] ); } else { printf( "%s is not a dir\n", argv[n] ); } } } 

No sé si eso ayuda. Tenga en cuenta que el código de ejemplo de readdir () utiliza opendir () como schot sugiere. Pero no puedo explicar por qué su readdir () parece funcionar independientemente.

Mi comstackdor dice: “advertencia: ‘dir’ se usa sin inicializar en esta función” Es posible que desee agregar dir = opendir(root); después de inicializar la root . Y no te olvides de añadir alguna comprobación de errores.

Dudo que esto cause tu problema, jcomeau_ictx probablemente tenga razón. Si lstat devuelve -1, establece errno en un valor que indica el tipo de error. Mira su página de manual y la página de strerror de strerror

A pesar de que esta pregunta se hizo hace mucho tiempo, y la encontré debido a esta pregunta . pero las respuestas aquí realmente no resolvieron el problema, así que decidí publicar la respuesta que escribí en otra publicación , de manera que si alguien tuviera el mismo problema y usara Google para encontrar esta página, hay una respuesta clara.

La razón real de que S_ISDIR no funcione como se esperaba es que dp->d_name solo contiene el nombre del archivo, debe pasar la ruta completa del archivo a lstat() .