EN JA
DIR(5)
DIR(5) FreeBSD File Formats Manual 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) システムコールによって返される 
 * ディレクトリエントリの形式を定義しています. 
 * 
 * ディレクトリエントリには, その inode 番号, エントリの長さ, とエントリに含 
 * まれている名前の長さを含んでいる, その前の部分に struct dirent があります. 
 * ヌルバイトで 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) 
 
/* 
 * XGENERICXDIRSIZ マクロは, ディレクトリエントリを保持する最小のレコード 
 * 長を与えます. これは, 4 バイト境界に丸められる, d_name フィールドなしで 
 * struct direct の空間の量に加えて, ヌルバイトで終了する名前のための十分な 
 * 空間 (dp->d_namlen+1) を必要とします. 
 */ 
#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)

歴史

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

バグ

struct dirent のメンバ d_type の使用は、 FreeBSD 特有であり、移植性がありません。また、特定のファイルシステム、例えば、cd9660 ファイルシステムで、失敗するかもしれません。
April 19, 1994 FreeBSD