d_type
lstat(2)
を節約する速度の最適化です サポートされている場合は呼び出します。
readdir
のように (3) man ページが指摘しているように、すべてのファイルシステムが d_type
で実際の情報を返すわけではありません フィールド (通常、mkfs.xfs -n ftype=1
を使用しなかった場合の XFS の場合と同様に、inode を読み取るために余分なディスク シークが必要になるためです) (-m crc=1
によって暗示されます) これはまだデフォルトではありません)。常に DT_UNKNOWN
を設定するファイルシステム 実生活ではよくあることであり、無視できるものではありません。 XFS だけが例ではありません。
lstat
を使用するようにフォールバックするコードが常に必要です (2) d_type==DT_UNKNOWN
の場合 、ファイル名だけでは面白くないと判断するのに十分でない場合。 (これは、find -name
のような一部の呼び出し元の場合です。 または *.c
のような展開グロブ 、これが readdir
の理由です 追加のディスク読み取りが必要な場合でも、それを埋めるオーバーヘッドは発生しません。)
Linux getdents(2)
man ページには、d_type
をデコードする連鎖三項演算子ブロックを含む、あなたがしようとしていることを実行するサンプル プログラムがあります。 フィールドをテキスト文字列に変換します。 (他の回答が指摘しているように、あなたの間違いは DT_REG
と比較するのではなく、文字として出力することです 、 DT_DIR
など)
とにかく、他の回答はほとんどのことをカバーしていましたが、フォールバックが必要であるという重要な詳細を見逃していました d_type == DT_UNKNOWN
の場合 (Linux では 0。d_type
は、Linux 2.6.4 まではパディング バイトとして使用されていたものに格納されます)。
移植可能にするには、コードで struct dirent
を確認する必要があります d_type
さえあります フィールドを使用しない場合、コードはコンパイルすらできません GNU および BSD システムの外部。 (readdir(3)
を参照) )
readdir でディレクトリを検索する例を書きました 、 d_type
を使用 stat
へのフォールバック d_type がコンパイル時に利用できない場合、DT_UNKNOWN の場合、およびシンボリック リンクの場合。
d_type
戻り構造体では、型の数値を示します。使用された値は ASCII として解釈されると印刷できないため、直接印刷することはできません (たとえば、ディレクトリの場合は 4、ファイルの場合は 8 です)。
次のように数値として出力することもできます:
printf("%d ", dent->d_type)
または、それらを DT_DIR
のような定数と比較します char 型のように、そこから意味のある出力を作成します:
if(dent->type == DT_DIR) type = 'd'
d_type
を出力 次のような整数として:
printf("%d ", dent->d_type);
意味のある値が表示されます。