2017-11-16 11 views
-1

現在、私は通常のファイルとディレクトリを区別する必要がある再帰的な検索を実行しようとしています。 与えられたファイルがディレクトリであるのに/ homeに適用された場合、私はS_ISDIRでループを確認しましたが、期待した結果が得られません。 私はそう期待される結果は以下のようになり/ホームで仁ディレクトリを持っている:ディレクトリの異なる値を返すS_ISDIR

/home/. 
/home/.. 
/home/pome 

それがディレクトリとして仁を検出していない、S_ISDIR()仁と1のために0を返します。そして...

コード:

DIR * dir = opendir("/home"); 
if(dir==NULL){ 
    puts("Unknown directory"); 
    return 1; 
} 
char path[SIZE_PATH]; 
memset(path,'\0',sizeof(path)); 
strcpy(path,"/home"); 
struct dirent * trucdir; 
char filename[SIZE_PATH]; 
memset(filename,'\0',sizeof(filename)); 
struct stat * filestat=malloc(sizeof(struct stat)); 
while((trucdir=readdir(dir))!=NULL){ 
    memset(filename,'\0',sizeof(filename)); 
    strcpy(filename,trucdir->d_name); 
    stat(filename,filestat); 
    if(S_ISDIR(filestat->st_mode)!=0){ 
     puts(filename); 
    } 
} 

は、ファイルがディレクトリである場合はゼロ以外の値を返すことになってS_ISDIRませんか?

+0

あなたの問題とは無関係ですが、関数がポインタを期待しているからといって、それを動的に割り当てる必要はありません。 'struct stat'と' stat'関数を使って、 'struct stat filestat;'と 'stat(filename、&filestat);を使ってもうまくいくでしょう。 –

+1

'stat()'呼び出しがどのように機能したのですか? –

+0

あなたの問題については、 'opendir'に渡されたパスを' readdir'によって与えられた名前と連結することを忘れてしまいます。また、 'stat'が返すものをチェックして、' -1'を返し、 'errno'を' ENOENT'に設定すると確信しています。この問題は、[あなたのプログラムをデバッグする方法を知っていれば]非常に明白だったはずです(https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

答えて

2

stat() -callが実際にであることを確認する必要があります。戻り値を確認してを確認してください。

stat("pome", filestat); 

が、現在の作業ディレクトリ(CWD)ではありません/ホーム:あなたのケースでは、STATへの呼び出しがあります!

したがって、statの呼び出しは-1で失敗し、errno ENOENTIS_DIR -macroは意味がありません。彼らはすべてのディレクトリに存在しているので、あなたはあなたが提供するいずれかのことを確認する必要があり

を(などのinode番号のような他の情報が一致していませんが).そしてもちろん..にSTAT-呼び出しは、成功しますフルパスを(つまり/home/pome)に設定するか、cwdを/ home before(chdir("/home");)に設定します。これはあなたの問題を解決するはずです!

+0

'chdir()'の使用には気をつけましょう。必要であれば元に戻すのは難しいでしょう。 'fchdir()'を使って戻るには、 'chdir()'を使う前にディレクトリを開き、 'fchdir()'を使って戻ることができます。 1つのディレクトリを処理した後にアプリケーションが終了すると、 'chdir()'は正常です。プログラムに10個の引数をそれぞれ処理する必要があり、引数の一部が絶対パス名ではなく相対パスである場合は、起動した場所に戻ることを心配する必要があります。しかし、これは良い答えに関する解説です。問題の問題は、 'stat()'が失敗するということです。 –

関連する問題