DIR(5)

名称
dir, dirent - ディレクトリファイルフォーマット

書式
<dirent.h>

解説
ディレクトリは、土台となる記憶媒体の詳細を隠蔽し、 ファイルをグループ分けする便利な階層手段を提供します。 ディレクトリファイルは、その 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 構造体は、getdirentries(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];  /* 名前はこの長さを越えてはならない */
    #endif
    };
    /*
     * ファイルタイプ
     */
    #define	DT_UNKNOWN	 0
    #define	DT_FIFO		 1
    #define	DT_CHR		 2
    #define	DT_DIR		 4
    #define	DT_BLK		 6
    #define	DT_REG		 8
    #define	DT_LNK		10
    #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
    #endif /* !_SYS_DIRENT_H_ */

関連項目
fs(5), inode(5)

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

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