¿Cuál es la forma correcta de utilizar la función stat () para probar si un Dirent es un directorio o un archivo?

StackOverflow https://stackoverflow.com/questions/1542763

  •  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);
}
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top