2011-06-06 3 views
1

通常のファイルをディレクトリに表示したい。ただし、すべてのファイルに対してstatが失敗します。リソースを一時的に利用できなく 通常のファイルのみリスト表示、statの問題

をstatできません::リソース一時的に利用できなく

をstatできません:リソースを一時的

DIR* dp = NULL; 
struct dirent* entry = NULL; 
dp = opendir(directory); 

if (!dp) { log_err("Could not open directory"); return -1; } 

while (entry = readdir(dp)) 
{ 
    struct stat s; 
    char path[1024]; path[0] = 0; 
    strcat(path, directory); 
    strcat(path, entry->d_name); 

    int status = 0; 

    if (status = stat(path, &s)) 
    { 
     if (S_ISREG(s.st_mode)) 
     { 
      printf("%s\n", entry->d_name); 
     } 
    } 
    else 
    { 
     fprintf(stderr, "Can't stat: %s\n", strerror(errno)); 
    } 
} 

closedir(dp); 

出力は

をstatできないです利用不可

(...何回も)

errnoE_AGAIN(11)に設定されています。

ここで、結果のpathを印刷すると、実際には有効なファイル名とディレクトリ名になります。ディレクトリは読み込み可能で、実行するユーザーにはその権限があります(プログラムを書き込むディレクトリです)。

この問題の原因は何ですか。これをどうすれば正しく行うことができますか?

+0

は、ファイルにつながるパス内のディレクトリのすべてに許可されていることが実行権限を確認しましたか? – patapizza

答えて

3

statなど多くのシステムコールは、成功すると0、失敗した場合は-1を返します。返り値statを間違ってテストしています。

あなたのコードは次のようになります。

if (!stat(path, &s)) 
{ 
    if (S_ISREG(s.st_mode)) 
    { 
     printf("%s\n", entry->d_name); 
    } 
} 
else 
{ 
    fprintf(stderr, "Can't stat: %s\n", strerror(errno)); 
} 
0

おそらく区切り記号がありません。

strcat(path, directory); 
strcat(path, "/"); //this is missing 
strcat(path, entry->d_name); 

文字列を割り当てるときに余分な '/'を忘れないようにしてください。

+0

いいえ、それは欠けていません。 –

関連する問題