Quelle est la bonne façon d'utiliser la fonction stat () pour tester si un est un répertoire dirent ou un fichier?

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

  •  20-09-2019
  •  | 
  •  

Question

Je vais avoir des problèmes avec la ligne «si (S_IFDIR (de stbuf.st_mode)). Est-ce la bonne façon de tester un répertoire récursif en? La fonction au moment semble faire droit pour 1 ou 2 boucles et puis échoue et des erreurs de segmentation.

J'ai essayé ce qui suit et probablement plus que la condition.

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

J'ai inclus toute la fonction parce que je suis préoccupé par le problème pourrait être ailleurs.

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);
}
Était-ce utile?

La solution

Oui, c'est exact. Mais puisque vous ne changeras jamais dans le répertoire, vous ne trouverez pas.

Considérons la hiérarchie de répertoire suivant:

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

Votre code scanne son répertoire courant, et trouver « un ». Il déterminera qu'il est un répertoire, et s'appeler récursive, et ouvrir « un » pour la lecture. Cela marche. Cette analyse se trouve un répertoire appelé « b », mais en essayant de l'ouvrir en utilisant le nom d'entrée échouera uniquement, puisque le chemin est maintenant « a / b ».

Je recommande de changer dans le répertoire (avec chdir()) avant de l'ouvrir. Cela signifie que vous pouvez juste opendir("."). Conservez l'ancien chemin, et chdir() à nouveau lorsque récursion ce niveau se fait (pas avant de faire un appel récursif pour aller plus loin).

Autres conseils

Où est définie l'entrée? est-il une variable locale? Je ne vois pas pourquoi il serait une erreur de segmentation, mais peut-être que vous devriez en faire une variable locale. Un exemple où vous mordre est ici:

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

Le printf est va imprimer le mauvais nom, alors vous devriez probablement ajouter un autre ici.

La même chose est vraie avec dirpnt. Lorsque vous sortez de getFolderContents dans la boucle while, vous finissez par appeler readdir sur un dirpoint fermé, ce qui devrait vous sortir de la boucle.

Mais comme l'a dit bahbar: Vous ne pouvez pas récursif et stocker variable temporaire dans la variable globale

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top