Qual è il modo corretto di utilizzare la funzione stat () per verificare se un DIRENT è una directory o di un file?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Sto avendo qualche problema con il 'se (S_IFDIR (stbuf.st_mode))' linea. E 'questo il modo corretto per testare una directory ricorsivamente? La funzione al momento sembra di farlo bene per 1 o 2 loop e poi non riesce e difetti di segmentazione.

Ho provato quanto segue e probabilmente più come condizione.

S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)

Ho incluso l'intera funzione in quanto mi riguarda il problema potrebbe essere altrove.

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);
}
È stato utile?

Soluzione

Sì, è corretto. Ma dal momento che non cambia nella directory, non lo troverete.

Si consideri il seguente gerarchia di directory:

 a
 |
 +- b
 |  |
 |  +- c
 ...

Il codice esegue la scansione sua directory corrente, e trovare "a". Esso determinerà che si tratta di una directory, e chiamare se stessa in modo ricorsivo, e aprire "a" per la lettura. Questo funziona. Quel scansione trovare una directory chiamata "b", ma cercando di aprirla utilizzando il nome della voce unica fallirà, in quanto il percorso è ormai "A / B".

Vi consiglio la modifica nella directory (con chdir()) prima di aprirlo. Ciò significa che si può solo opendir("."). Conservare il vecchio sentiero, e chdir() di nuovo quando recursing quel livello è fatto (non prima di fare una chiamata ricorsiva ad andare più in profondità).

Altri suggerimenti

Quando si definisce l'ingresso? si tratta di una variabile locale? Non riesco a capire il motivo per cui sarebbe segmentation fault, ma può essere che si dovrebbe fare è una variabile locale. Un esempio in cui ti morderà è qui:

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

Il printf è la stampa andando il nome sbagliato, quindi probabilmente si dovrebbe aggiungere un altro qui.

Lo stesso vale con dirpnt. Quando si va fuori getFolderContents all'interno del ciclo while, si finisce per chiamare readdir su un dirpoint chiuso, che dovrebbe farti fuori dal giro.

Ma, come affermato da bahbar: Non si può ricorsivamente e memorizzare variabile temporanea nella variabile globale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top