現在、私は通常のファイルとディレクトリを区別する必要がある再帰的な検索を実行しようとしています。 与えられたファイルがディレクトリであるのに/ 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ませんか?
あなたの問題とは無関係ですが、関数がポインタを期待しているからといって、それを動的に割り当てる必要はありません。 'struct stat'と' stat'関数を使って、 'struct stat filestat;'と 'stat(filename、&filestat);を使ってもうまくいくでしょう。 –
'stat()'呼び出しがどのように機能したのですか? –
あなたの問題については、 'opendir'に渡されたパスを' readdir'によって与えられた名前と連結することを忘れてしまいます。また、 'stat'が返すものをチェックして、' -1'を返し、 'errno'を' ENOENT'に設定すると確信しています。この問題は、[あなたのプログラムをデバッグする方法を知っていれば]非常に明白だったはずです(https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –