2017-10-04 6 views
0

最終更新 - 回答は受け入れられた回答のコメントにあります。dirent.hのCの使用

まず、この質問には他にも多くの回答があります。私はそれらのほとんどを経験してきました。このコードは、他の多くの回答を通したものです。私がしたいのは、ディレクトリ内のすべてのファイルへの完全なパスに到達することだけです。

#include <limits.h> 
#include <dirent.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    DIR *d; 
    struct dirent * dir; 
    char fullpath[PATH_MAX + 1]; 
    d = opendir("/home/adirectory"); 
    if(d != NULL) 
    { 
      while((dir = readdir(d)) != NULL) 
      { 
       realpath(dir->d_name, fullpath); 
       printf("[%s]\n", fullpath); 
       printf("%s\n", dir->d_name); 

      } 
      // addition of the following line yields 
      // Value too large for defined data type 
      perror("Something isn't working: "); 
      closedir(d); 

    } 

return 0; 
} 

更新#3:

失敗したコールは、私はすぐにwhileループの後 PERROR持っている理由である、dir = readdir(d)です。

更新#2:

これはCentOSの、およびUbuntuのGCC 4.8.5 +上だけで正常に動作します。 Solaris gcc 4.5.2で動作しません。

更新: エラーメッセージがあります:定義されたデータ型

ため

値が大きすぎる...しかし、私はこれを引き起こす可能性があるかわからないんだけど。

これは、プログラムを実行している現在の作業ディレクトリを表示するだけです。それでも、実際には、 "。"以外のディレクトリ内のファイルは表示されません。と ".."。何がありますか?許可の問題がありますか?このソリューションは2017年には機能しませんか?

+2

これをそのままコンパイルして実行してくれて、うまく動作します。あなたは '/ home/adirectory'に対して読み込みと実行の許可を持っていますか? 'cd/home/adirectory'を試して、' ls'を実行して結果を得ることができるかどうかを見てください。 – lurker

+0

これはLinux上で動作します。私は自分のホームディレクトリになるようにディレクトリを変更しました。 – wallyk

+0

私は読み取り権のみが必要ですか? – LBaelish

答えて

1

d_nameフィールドには、通過するディレクトリのコンテキスト内のファイルの名前が格納されます。だから、名前だけのパスは含まれていません。

だから、あなたはそのパスで再生するためには、あなたがディレクトリの名前にd_nameを追加する必要があり、次のようなもの:もちろん

char *myHomeDir = "/home/adirectory"; 
d = opendir(myNomDir); 
. . . 
while((dir = readdir(d)) != NULL) { 
    char filepath[PATH_MAX + 1] ; 
    strcpy(filepath, myHomeDir); 
    strcat(filepath, "/"); 
    strcat(filepath, dir->d_name); 
    realpath(filepath, fullpath); 

上記のものは、単にスケルトンです明確にするためのコード。それは最適化され、strncpyファミリーの関数を使用する必要があります。

+0

これは、現在の作業ディレクトリへのパスを出力する前に、私に正しいパスを与えます。しかし、私はまだ同じ問題だけを見ています。と..が出力され、定義されたデータ型のエラーメッセージ値が大きくなります。 – LBaelish

+0

コンパイル時または実行時メッセージですか?前者の場合は、行番号を指定するよりも、後者の場合は、共有ライブラリを持つ32/64サイズの混合音のように聞こえます。コンパイルとリンクに '-m32'または '-m64'クールを使用できますか? – Serge

+0

うわー、この問題を解決する '-m64'のように見えます!ありがとうございました!あなたは精緻化して気にするならば、私はまだ問題が正確に何かを理解していませんが? – LBaelish

関連する問題