tail head cat sleep
QR code linking to this page

manページ  — DIR

名称

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

内容

書式

#include <dirent.h>

解説

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

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

ファイルシステムノードは普通のディレクトリファイルであり、 その上に物理ディスクやそのディスク中の分割された領域といった ファイルシステムオブジェクトを接合します ( 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 ファイルシステムでは失敗します。

歴史

ファイル形式 dirAT&T v7 で登場しました。

DIR (5) April 19, 1994

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

A typical Unix /bin or /usr/bin directory contains a hundred different kinds of programs, written by dozens of egotistical programmers, each with its own syntax, operating paradigm, rules of use ... strategies for specifying options, and different sets of constraints.
— The Unix Haters' handbook