GNU/Linux >> Linux の 問題 >  >> Linux

ディレクトリかどうかを確認しています。 readdir によって返されるエントリは、ディレクトリ、リンク、またはファイルです。 dent->d_type でタイプが表示されない

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);

意味のある値が表示されます。


Linux
  1. Linuxのディレクトリツリーで最も古いファイルを見つける方法

  2. シェルでファイルを実行するとどうなりますか?

  3. /etc/sysconfig ディレクトリについて

  1. Python でファイルまたはディレクトリの所有者を見つける方法

  2. 現在のディレクトリ内のすべてのファイルに対してコマンドを実行します

  3. .tar.gz ファイルの作成時にディレクトリを除外する

  1. cd コマンドの man ページがない

  2. bash:./helloworld_s:そのようなファイルまたはディレクトリはありません。ファイルは明らかにそこにあります

  3. ルート ディレクトリが / 記号で示されるのはなぜですか?