スポンサーリンク

DIR(5) FreeBSD ファイルフォーマットマニュアル DIR(5)

名称

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

書式

#include <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 は Version 7 AT&T UNIX で登場しました。

FreeBSD 10.0 April 19, 1994 FreeBSD 10.0

スポンサーリンク