c linux file readdir

c - ¿Por qué falla stat usando un nombre de readdir?



linux file (1)

readdir clásico de readdir : pDirent->d_name es el nombre de la entrada del directorio, no una ruta al archivo. Es "1" , "4-5.c" , etc. Por lo tanto, sus llamadas stat buscan un archivo con ese nombre en el directorio actual , no en MyDirectory .

Verifique el valor de retorno de stat . Verás que es ENOENT , excepto por . y .. , que también existen en el directorio actual. Cuando stat falla, el contenido de la estructura de estadísticas no está definido.

Si llama a opendir en un directorio que no sea . , para hacer prácticamente cualquier cosa útil con los nombres devueltos, debe crear una ruta completa. Copie la ruta que pasó a opendir a un búfer con espacio suficiente para una barra oblicua y un nombre de archivo además, y copie cada nombre de archivo a ese búfer. Código de prueba de concepto (omisión de comprobación de errores, etc.):

char *directory = "MyDirectory"; size_t directory_length = strlen(directory); char *path = malloc(directory_length + 1 + NAME_MAX); strcpy(path, directory); path[directory_length] = ''/''; while ((pDirent = readdir(pDir)) != NULL) { strcpy(path + directory_length + 1, pDirent->d_name); if (stat(path, &vStat) == -1) { perror(path); continue; } … }

Escribí un programa que imprime el nombre del directorio o el nombre del archivo. Es fácil pero tengo un problema. No se pudo distinguir el directorio y el tipo de archivo. Lo sé y usé stat.st_mode para terminarlo. Pero algo está mal:

Cuando uso gdb para verificar el valor st_mode, encontré que era 0, excepto "." y "..", así que aquí está la pregunta: ¿por qué st_mode es 0?

y ese es mi código:

#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/stat.h> int main(void) { DIR *pDir = opendir("MyDirectory"); struct dirent *pDirent; struct stat vStat; if (pDir == NULL) { printf("Can''t open the directory /"MyDirectory/""); exit(1); } while ((pDirent = readdir(pDir)) != NULL) { stat(pDirent->d_name, &vStat); if (S_ISDIR(vStat.st_mode)) printf("Directory: %s/n", pDirent->d_name); else printf("File: %s/n", pDirent->d_name); } closedir(pDir); return 0; }