1

了解しました。問題が発生しています。これが私のコードです(この前に呼び出されたopendir()):

while( (dp = readdir(dfd)) != NULL ) {
        if( strcmp(dp->d_name, ".") == 0 ||  strcmp(dp->d_name, "..") == 0)
            continue;

        lstat(dp->d_name, &stbuf);

        printf("%s: ", dp->d_name);

        if( S_ISDIR(stbuf.st_mode) )
            puts("Directory");
        else if ( S_ISREG(stbuf.st_mode) )
            puts("File");
        else if ( S_ISCHR(stbuf.st_mode) )
            puts("Character Device");
        else if ( S_ISBLK(stbuf.st_mode) )
            puts("Block Device");
        else if ( S_ISFIFO(stbuf.st_mode) )
            puts("Fifo");
        else if ( S_ISLNK(stbuf.st_mode) )
            puts("Link");
        else
            puts("Socket");
    }
    return;
}

私はディレクトリを読んで、ファイルタイプが何であるかを判断しています。唯一の問題は、これが常に「ディレクトリ」を出力することであり、lstatの呼び出しと関係があると思います。適切に変更する方法が正確にはわかりません。

4

2 に答える 2

4
lstat(dp->d_name, &stbuf);

これには、ファイルの名前のみがdp->d_name含まれ、絶対パスは含まれません。したがって、おそらく失敗しますが、戻り値をテストしていないため、気付くことはできません。

ディレクトリのパス(つまり、渡したパス)を前に付ける必要がありますopendir

于 2012-07-02T16:09:19.493 に答える
3

私は懸念の2つの明白な原因を見ることができます:

  1. 適切なパスを構築していません。ディレクトリにいる場合(つまり、行った場合)を除いてopendir(".")、間違ったパスをに渡していますlstat()。ディレクトリの名前を各ファイルの名前と連結する必要があります。ディレクトリを開くことは、それを現在のディレクトリにすることを意味しません。
  2. lstat()戻り値を調べる前に、それが成功したかどうかをチェックしていません。
于 2012-07-02T16:10:07.143 に答える