2009-10-09 6 views
4

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 dans lequel se rouvrir? La fonction pour le moment semble bien faire pour 1 ou 2 boucles, puis échoue et les défauts de segmentation.Quelle est la bonne façon d'utiliser la fonction stat() pour tester si un DIRENT est un répertoire ou un fichier?

J'ai essayé ce qui suit et probablement plus que la condition. J'ai inclus la fonction entière 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); 
} 
+0

global Pour le look de réponse [ici] (http://stackoverflow.com/questions/7267295/how-can -i-copy-a-file-from-one-directory-to-another-in-cc/38588376 # 38588376). – te7

Répondre

3

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

Tenir compte de 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 s'agit d'un répertoire, et s'appellera récursivement, et ouvrira "a" pour la lecture. Cela marche. Cette analyse va trouver un répertoire appelé "b", mais essayer de l'ouvrir en utilisant le nom d'entrée seulement échouera, 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 simplement opendir("."). Stockez l'ancien chemin et chdir() à nouveau lorsque le niveau est récursif (pas avant de faire un appel récursif pour aller plus loin).

+0

hum, cela n'expliquerait pas le SEGFAULT bien? – Bahbar

+0

Lorsque la structure d'entrée est testée et qu'il s'agit d'un répertoire, j'appelle de nouveau la fonction récursivement, ce qui ouvre alors ce chemin de répertoire. – cheesysam

+0

Voulez-vous dire alors je dois inclure le chemin relatif complet au répertoire que j'ai commencé avec? – cheesysam

1

Où est définie l'entrée? est-ce une variable locale? Je ne vois pas pourquoi il segfault, mais peut-être 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 point de direc- tion fermé, ce qui devrait vous sortir de la boucle.

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

+0

struct dirent * entry; défini juste avant la main() – cheesysam

+1

vous ne pouvez pas récursif et de stocker des valeurs temporaires dans un monde. Mettez l'entrée et le répertoire comme variables locales – Bahbar

+0

Merci Bahbar Je pense que cela me retenait beaucoup. Ca marche beaucoup mieux maintenant mais ça ne marche que dans un seul dossier. – cheesysam

Questions connexes