0

ディレクトリを開き、その内容を読み取り、各ファイルに関する情報を出力するコードに取り組んでいます。コマンドラインを調べて、引数が指定されていない場合は、指定されたディレクトリまたは現在のディレクトリの内容を出力します。以下のコードは、現在のディレクトリを出力するために使用されるコードとほぼ同じです。唯一の違いは、argv[1] の代わりに最初の if ステートメントに "." があることです。以下のコードは、while ループの最初の if ステートメント (現在のファイルと等しい結果を設定した後のステートメント) にヒットし、ディレクトリ内のすべてのファイルに対して言います

statBuffer の読み込み中のエラー: : そのようなファイルまたはディレクトリはありません statBuffer の読み込み中の
エラー: : そのようなファイルまたはディレクトリはありません
statBuffer の読み込み中のエラー: : そのようなファイルまたはディレクトリはありません statBuffer の読み込み中のエラー: : そのようなファイル
またはディレクトリはありません statBuffer の読み込み
中のエラー: :そのようなファイルまたはディレクトリはありません
。thaddueus thaddueus 4096 水 5 月 1 日 18:34:42 2013

statBuffer の読み込み中にエラーが発生しました: : そのようなファイルまたはディレクトリはありません

これが私が使用するコードです。

else if(argc > 1){
    if((dir = opendir(argv[1])) == NULL){
    perror("opendir() error");
}else{
    while((entry = readdir(dir)) != NULL){
    result = stat(entry->d_name, &statBuf);
    if(result == -1)perror("Error while loading statBuffer: ");
        else{
            /*Line of code I added directly below this based upon David's suggestion*/
             snprint(pathname, sizeof(pathname), "%s/%s", argv[1], entry->d_name);
            /*Addition cause Segmentation fault core dumped*/
    if(strncmp(entry->d_name, "..",100) == 0 ||strncmp(entry->d_name, ".",100))
        continue;
    errno = 0;
    pws = getpwuid(statBuf.st_uid);
    if(errno != 0)
    perror("Error while retriving username: ");         
    errno = 0;
    grp = getgrgid(statBuf.st_gid);
    if(errno != 0) perror("Error while retriving groupname: ");                 
    /*Prints the filename*/
    printf("%s", entry->d_name);
        /*Prints the username*/
    printf("\t%s", pws->pw_name);
    /*Prints the groupname*/
    printf("\t%s", grp->gr_name);
    /*Prints the file size*/
    printf("\t%ld", (long)statBuf.st_size);
    /*Prints the last modification time*/
    printf("\t%s\n", ctime(&(statBuf.st_mtime)));
    }   
}
closedir(dir);
}
}

編集:それ

. thaddueus thaddueus 4096 水 5 月 1 日 18:34:42 2013

隠しファイルです。それが印刷されるかどうかはわかりませんが、他の人は印刷されません。

EDIT1:申し訳ありません。ファイル名を取得していることを追加するのを忘れました。

EDIT2:エラーステートメントを削除すると、エラーステートメントの出力が停止し、隠しファイルだけが出力されます。

4

1 に答える 1

1

ディレクトリを開いて ( dir = opendir(argv[1])) 読み込んでいるようentry = readdir(dir)に見えますが ( )、現在のディレクトリにしているようには見えません。

entry->d_name に含まれるファイル名は完全なパス名ではなく、ディレクトリ内のファイルの名前です。パス名 (dir/filename) を作成するか、現在のディレクトリ ( chdir) を見ているディレクトリを作成する必要があります。

EDIT 次のようなパス名を作成できます。

char pathname[1024]; // must be large enough for dirname+filename
snprintf(pathname, sizeof(pathname), "%s/%s", argv[1], entry->d_name);

snprintf(a) 最大長のディレクトリ名 + ファイル名を保持するのに十分な大きさの変数を定義し、(b) 最大長を指定できる関数 (この場合は ) を使用してその変数にコピーするように注意する必要があることに注意してください。何があっても、変数の末尾を超えて書き込まないようにするためです。

ps。あなたはそれについて言及します

以下のコードは、現在のディレクトリを出力するために使用されるコードとほぼ同じです

複製するのではなく、現在のディレクトリと指定されたディレクトリの両方に同じコードを使用できる方法があるかどうかを検討することをお勧めします。

于 2013-05-02T02:04:20.173 に答える