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;
}