2017-01-10 12 views
1

ディレクトリとそのサブディレクトリ内のすべてのファイルとフォルダの名前を印刷しようとしています。 ファイルはディレクトリとも呼ばれるという問題がありますか?私のコード全体を投稿して申し訳ありませんが、なぜこれが起こっているのかわかりません。ありがとうございました。あなたはopendir()で開かれたディレクトリにstat()を呼んでいるS_ISDIRはファイルがディレクトリだと思っています

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/stat.h> 
#include <dirent.h> 
#include <string.h> 

void parcurgere(char path[1000]){ 

    char aux[1000]; 
    strcpy(aux, path); 

    struct dirent *ent; 
    DIR *d = opendir(path); 

    while((ent = readdir(d))){ 

     struct stat my_stat; 

     stat(path, &my_stat); 
     if(S_ISDIR(my_stat.st_mode) && strcmp(ent->d_name, ".")!=0 && strcmp(ent->d_name, "..")!=0 && strcmp(ent->d_name, ".DS_Store")!=0){ 
      printf("%s - folder\n", ent->d_name); 
      char x[1000]; 
      strcpy(x, path); 
      strcat(x, "/"); 
      strcat(x, ent->d_name); 
      parcurgere(x); 
     } 
     if(S_ISREG(my_stat.st_mode)){ 
      printf("%s - fisier\n", ent->d_name); 
     } 

     strcpy(path, aux); 
     //path[strlen(path) - poz] = '\0'; 
    } 
} 

int main(){ 

    char path[1000]; 
    strcpy(path, "."); 

    parcurgere(path); 

    return 0; 
} 
+1

@MichaelWalz私はそれをしました。それは最初の場合です。 –

+0

@RadLexusフォルダ構造/ツリーを意味しますか? –

+0

デバッガでコードを実行すると、すぐにこの問題を見つけることができます。私はここにlinuxを持っていないので、私は確認できません。 –

答えて

4

DIR *d = opendir(path); 

while((ent = readdir(d))){ 

    struct stat my_stat; 

    stat(path, &my_stat); 

そうです、my_statの内容は、それがディレクトリであるということを示している - pathはディレクトリですので。

返品コードもstat()から確認していません。それが失敗し、pathstat()に変更すると、readdir()から返されたエントリは、stat()が失敗した場合に不正確な結果になります。

+2

これを修正するには、 'path' +/+' ent-> d_name'から文字列を作り、 'stat()'に渡す必要があります。つまり、 'x'配列を生成するコードを動かしてください、 'stat(x、&my_stat);を実行してください。 – nos

+0

@nos確かに。実際、私は何とか元々、 'stat(ent-> d_name、&my_stat);'を呼び出すと、投稿されたコードを読んでいたので、私の削除された答え... –

+0

ありがとう、ありがとう、ありがとう! –

関連する問題