2011-06-28 4 views
-2

では、ファイル内にファイルがある場合を除き、再帰的にファイルとディレクトリをLINUX環境で実行します。 私の関数fooは、現在のディレクトリからすべてのファイルをリストする)。再帰的なCファイルのリスト_dir内のファイルに対して_stat()関数が失敗しました

if((err=stat(full_child_entity_path,childStat)) <0) 

が失敗したので、これは、任意のディレクトリ内のファイルを印刷しません。私は今、この問題を数日間してきました。誰でもこの機能をなぜ説明しようとすることができます が失敗していますか?

注:私はすべてのファイルとディレクトリに完全なアクセス権を持ち、ファイル/ディレクトリには完全な権利があります。

ありがとうございました!

int foo(char* dir_location) 
{ 

    if((err=stat(full_child_entity_path,childStat)) <0) 
    { 
    printf("Some sort of error with getting file stat %d <%s>\n",err,childDirent->d_name); 
    } 
    opendir() 
    while {readdir()!=null} 
    if(strcmp(childDirent->d_name,".")==0 || strcmp(childDirent->d_name,"..")==0) continue; 

    if(S_ISREG(childStat->st_mode)) printf("name of file"); 
    else if(S_ISDIR(childStat->st_mode)) foo("concatinate dir_location+"/"+childDirent->name); 
} 
+7

このコードはコンパイルできません。それは本当にあなたがバグを持っているのと同じコードですか?コピー&ペーストして、メモリから再入力しないでください。 – bdonlan

+1

'stat()'のような関数が失敗すると、 'stderr'にエラーを出力するために' perror( "stat"); 'を使います。 – caf

答えて

1

私はあなたが(nullのチェックのほかに)機能readdir()の戻り値を無視するので、それがあると思います。それは実際にあなたが後で参照する子供direntを返します。また、戻り値opendir()を無視します。これは、readdir(...)への正常な呼び出しのためのディレクトリを提供します。

+0

こんにちはハワード。返信いただきありがとうございます。
私はちょうどそれを考え出した。私の再帰呼び出しでは、追加の "/"を追加するのを忘れていました。 dirパスは "/ dir/file1 /"の代わりに "/ dir1/file1"を読み込んでいました。だから、あなたのdirentの子供がディレクトリの場合、私は余分な "/"でそれを呼び出さなければなりませんでした。これは私の問題を解決しました。 – Alejandro

+2

@Alejandro、これはまさに私がメモリから再タイピングするのではなく、コピー&ペーストするように頼んだ理由です。再入力すると、このバグが修正され、誰でもあなたを助けることが不可能になりました。同時に、たくさんのバグを導入しました(Cで '+'で文字列を追加することはできません)。だから将来、あなたの正確なコードをコピー&ペーストしてください。それを再入力しないでください。 – bdonlan

関連する問題