¿Cuál es la forma correcta de utilizar la función stat () para probar si un Dirent es un directorio o un archivo?
-
20-09-2019 - |
Pregunta
Estoy teniendo algunos problemas con el 'si (S_IFDIR (stbuf.st_mode))' línea. Es este el camino correcto para la prueba de un directorio a Recursividad en? La función por el momento parece hacerlo bien para 1 o 2 bucles y luego falla y fallos de segmentación.
He intentado lo siguiente y probablemente más como la condición.
S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)
He incluido toda la función, ya que a mí respecta el problema puede estar en otro lugar.
void getFolderContents(char *source, int temp){
struct stat stbuf;
int isDir;
dirPnt = opendir(source);
if(dirPnt != NULL){
while(entry = readdir(dirPnt)){
char *c = entry->d_name;
if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){
}
else{
stat(entry->d_name, &stbuf);
printf("%i %i ", S_IFMT, stbuf.st_mode);
if(S_IFDIR(stbuf.st_mode)){ //Test DIR or file
printf("DIR: %s\n", entry->d_name);
getFolderContents(entry->d_name, 0);
}
printf("FILE: %s\n", entry->d_name);
}
}
closedir(dirPnt);
}
Solución
Sí, eso es correcto. Pero ya que nunca cambia en el directorio, no lo encontrará.
Considere la siguiente jerarquía de directorios:
a
|
+- b
| |
| +- c
...
Su código escaneará su directorio actual, y encontrar "a". Se determinará que se trata de un directorio, y llama a sí mismo de forma recursiva, y abrir "a" para la lectura. Esto funciona. Esa exploración se encuentra un directorio llamado "b", pero tratando de abrirlo con el nombre de entrada sólo se producirá un error, ya que el camino es ahora "A / B".
Yo recomiendo cambiar en el directorio (con chdir()
) antes de abrirlo. Eso significa que sólo puede opendir(".")
. Almacenar la ruta de edad, y de nuevo cuando chdir()
manera recursiva ese nivel se realiza (no antes de hacer una llamada recursiva a ir más profundo).
Otros consejos
Cuando se define la entrada? es una variable local? No puedo ver por qué sería segfault, pero puede ser que usted debe hacer que sea una variable local. Un ejemplo en el que va a morder está aquí:
if(S_IFDIR(stbuf.st_mode)){ //Test DIR or file
printf("DIR: %s\n", entry->d_name);
getFolderContents(entry->d_name, 0);
}
printf("FILE: %s\n", entry->d_name);
El printf va a imprimir el nombre equivocado, por lo que probablemente debería añadir una cosa aquí.
Lo mismo es cierto con dirpnt. Cuando sales de getFolderContents dentro del bucle while, se termina llamando readdir en un dirpoint cerrado, que debe conseguir que fuera del bucle.
Sin embargo, según lo declarado por bahbar: No se puede almacenar y recursivo variable temporal en la variable global