dirent(5) FreeBSD 一般コマンドマニュアル

dirent

前のページ 上に戻る 次のページ

dirent




解説

     ディレクトリは、土台となる記憶媒体の詳細を隠蔽し、ファイルをグループ分け
     する便利な階層手段を提供します。ディレクトリファイルは、その inode(5) エ
     ントリ中のフラグによって、通常ファイルと区別されます。ディレクトリファイ
     ルはレコード (ディレクトリエントリ) から構成され、各レコードはファイルに
     関する情報とそのファイル自身へのポインタを含んでいます。ディレクトリエン
     トリは、通常ファイルと同様に、他のディレクトリを含むこともあります。その
     ような入れ子になったディレクトリはサブディレクトリと呼ばれます。このよう
     にしてディレクトリとファイルの階層構造が形成され、この構造はファイルシス
     テムと呼ばれます (あるいはファイルシステムツリーと呼ばれます)。

     各ディレクトリファイルには特別なディレクトリエントリが 2 つあります。 1
     つはそのディレクトリ自身へのポインタで、ドット `.' と呼ばれます。もう 1
     つは自分の親ディレクトリへのポインタで、ドットドット `..' と呼ばれます。
     ドットとドットドットは有効なパス名ですが、システムのルートディレクトリ
     `/' には親ディレクトリがなく、ドットドットはドットと同じく自分自身を指し
     ます。

     ファイルシステムノードは普通のディレクトリファイルであり、その上に物理
     ディスクやそのディスク中の分割された領域といったファイルシステムオブジェ
     クトを接合します ( mount(2) および mount(8) 参照)。

     ディレクトリエントリの形式はファイル <sys/dirent.h> で定義されています (
     これは直接アプリケーションからはインクルードされません):

     #ifndef _SYS_DIRENT_H_
     #define _SYS_DIRENT_H_

     #include <machine/ansi.h>

     /*
      * dirent 構造体はB>Agetdirentries(2) システムコールで返される
      * ディレクトリエントリのフォーマットを定義します。
      *
      * ディレクトリエントリはその先頭に dirent 構造体を持ちます。dirent
      * 構造体は inode 番号、そのエントリの長さ、そのエントリに含まれる
      * 名前の長さを保持します。その後に、ナルで 4 バイト境界までパディング
      * した名前が続きます。名前は全てナルで終端していることが保証されます。
      * ディレクトリ中の名前の長さの最大値は MAXNAMLEN です。
      */

     struct dirent {
             __uint32_t d_fileno;            /* エントリのファイル番号 */
             __uint16_t d_reclen;            /* このレコードの長さ */
             __uint8_t  d_type;              /* ファイルタイプ, 以下参照 */
             __uint8_t  d_namlen;            /* d_name の文字列長 */
     #ifdef _POSIX_SOURCE
             char    d_name[255 + 1];        /* 名前はこの長さを越えてはならない */
     #else
     #define MAXNAMLEN       255
             char    d_name[MAXNAMLEN + 1];  /* 名前はこの長さを越えてはならない */

     #define DT_SOCK         12
     #define DT_WHT          14

     /*
      * stat 構造体型とディレクトリ型との変換
      */
     #define IFTODT(mode)    (((mode) & 0170000) >> 12)
     #define DTTOIF(dirtype) ((dirtype) << 12)

     /*
      * _GENERIC_DIRSIZ マクロはディレクトリエントリを保持する最小レコード長を
      * 与えます。これは d_name フィールド以外の dirent 構造体の空間に、ナル
      * バイトで終端される名前のために十分な空間 (dp->d_namlen+1) を加えたもの
      * を、4 バイト単位で繰り上げたものです。
      */
     #define _GENERIC_DIRSIZ(dp)     ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))

     #ifdef _KERNEL
     #define GENERIC_DIRSIZ(dp)      _GENERIC_DIRSIZ(dp)
     #endif



関連項目

     fs(5), inode(5)


BUGS

     struct dirent のメンバ d_type は FreeBSD 固有であり、使用はポータブルでは
     ありません。また、特定のファイルシステム、例えば cd9660 ファイルシステム
     では失敗します。


歴史

     ファイル形式 dir は Version 7 AT&T UNIX で登場しました。

FreeBSD 4.4                     April 19, 1994                     FreeBSD 4.4

ABELNET VPSサービス