FAT Directory Structure

これは最も簡単なFATディレクトリエントリの説明である。このドキュメントでは 長い形式の名前については言及せず、短い形式の名前についてのみ解説します。 FATのディレクトリの構造に関する完全な説明は「FAT:Long Name On-Media Format Specification」 を見てください

FATのディレクトリは32バイトの構造体が連続するファイルに過ぎません。唯一の特別な ディレクトリはルートディレクトリで、これは常に存在します。FAT12やFAT16のメディアでは ルートディレクトリはFAT(ファイルアロケーションテーブル)のすぐ次の領域にあり、 長さもBPBで定められた大きさになっています。FAT12やFAT16のメディアにおいて、 ルートディレクトリの最初の相対セクタ番号(FATボリュームの初めのセクタからの番号)は

FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16)

FAT32ではルートディレクトリは可変長で他のディレクトリと同様にクラスタチェイン構造を とっています。FAT32ボリュームのルートディレクトリの初めのクラスタ番号はBPBに 保存されています。ただ他のディレクトリと異なり、ルートディレクトリはタイムスタンプを 持たず、名前も持ちません。そして、"."や".."というディレクトリエントリも持ちません。 また、ルートディレクトリはATTR_VOLUME_IDの属性が付いたファイルを持つことが出来ます。 (下記参照)

FAT 32 Byte Directory Entry Structure
Name Offset
(byte)
Size
(bytes)
Description
DIR_Name 0 11 短い名前
DIR_Attr 11 1
ファイル属性:
ATTR_READ_ONLY 0x01
ATTR_HIDDEN 0x02
ATTR_SYSTEM 0x04
ATTR_VOLUME_ID 0x08
ATTR_DIRECTORY 0x10
ATTR_ARCHIVE 0x20
ATTR_LONG_NAME ATTR_READ_ONLY |
ATTR_HIDDEN |
ATTR_SYSTEM |
ATTR_VOLUME_ID
ファイル属性の上位2ビットは予約されていてファイルを作成するときは常に0に しておかなければなりません。また、変更したり参照してはいけません。。
DIR_NTRes 12 1 Windows NT用に予約されています。ファイルを作成するときは常に0に しておかなければならず、変更したり参照してはいけません。
DIR_CrtTimeTenth 13 1 ファイル作成時刻のミリ秒の部分です。このフィールドは実際には10分の1秒 単位で格納されいます。DIR_CrtTimeの最小単位が2秒なのでこのフィールドの値は 0から199までとなります。
DIR_CrtTime 14 2 ファイル作成時刻です
DIR_CrtDate 16 2 ファイル作成日付です
DIR_LstAccDate 18 2 最後に読み書きアクセスされた日付です。ちなみに、最後にアクセスされた時間は 保存されませんが、書き込まれた時刻はDIR_WrtDateに保存されます。
DIR_FstClusHI 20 2 このエントリの初めのクラスタ番号の上位16ビットの部分です。(FAT12やFAT16では この部分は常に0です。)
DIR_WrtTime 22 2 最後に書き込まれた時刻です。尚、ファイルの作成は書き込みとみなされます。
DIR_WrtDate 24 2 最後に書き込まれた日付です。尚、ファイルの作成は書き込みとみなされます。
DIR_FstClusLO 26 2 このエントリの初めのクラスタ番号の下位16ビットの部分です。
DIR_FileSize 28 4 このファイルの大きさで32ビット長です。

DIR_Name[0]

FATディレクトリエントリの初めのバイト(DIR_Name[0])は特別な意味を持っています。

DIR_Nameフィールドは実際には2つの部分にわかれ、名前の8文字の部分と拡張子の 3文字の部分に分かれます。これらの2つの部分のうち後ろの開いているところは スペース(0x20)で埋められます。

DIR_Nameは0x20で始まってはいけません。また、名前と拡張子の間には"."が 入りますが、DIR_Nameではそれは現れません。そして、小文字がきてもいけません。 (小文字がどのようなものであるかは国によって違います)

次に挙げる文字はDIR_Nameのどの部分に来てもいけません。

ここにユーザーが入力した名前がどのようにDIR_Nameに対応するかを示します。

"foo.bar"          -> "FOO     BAR"
"FOO.BAR"          -> "FOO     BAR"
"Foo.Bar"          -> "FOO     BAR"
"foo"              -> "FOO        "
"foo."             -> "FOO        "
"PICKLE.A"         -> "PICKLE  A  "
"prettybg.big"     -> "PRETTYBGBIG"
".big"             -> 入力できません。DIR_Nameはスペース文字で始めることは出来ません。

FATのディレクトリでは同一の名前は存在できません。先の例を見てください。これらの違う 名前はすべて同じファイルを参照し、DIR_Nameは"FOO BAR"となります。

DIR_Attrはファイルの属性を決めます。
ATTR_READ_ONLY ファイルへの書き込みが禁止されます
ATTR_HIDDEN 通常のディレクトリのリスティングではこのファイルは見えません。
ATTR_SYSTEM このファイルはシステムファイルとみなされます
ATTR_VOLUME_ID この属性の付いたファイルがルートディレクトリのみに存在し、そのファイルの 名前がボリュームラベルとなります。DIR_FstClusHIとDIR_FstClusLOは常に0と なります。(このファイルの対してデータクラスタは確保されない)
ATTR_DIRECTORY このファイルがディレクトリで、他のファイルを格納していることを意味します
ATTR_ARCHIVE この属性はバックアップユーティリティのためにあります。まず、ファイルが作成、 名前の変更、書き込みがされたときにこのビットがつき、バックアップが必要であることを 表わすようになります。バックアップユーティリティはこのビットを用いてどのファイルを バックアップするかを決めることが出来ます。

ATTR_LONG_NAMEを表わすビットの構成はこのファイルのエントリが別のファイルの名前の 一部を表わしていることを意味します。このビットの構成に関するより詳しい情報は FAT Long Filename specificationを参照してください。

ディレクトリを作成するときはDIR_AttrフィールドのATTR_DIRECTORYビットをセットします。 また、DIR_FileSizeは0にします。つまり、ディレクトリに対してはDIR_FileSizeは使用されず、 クラスタチェインによってディレクトリの大きさが決まります。そして、FAT16やFAT12の ルートディレクトリでなければそのディレクトリのためのクラスタを作成し、そのクラスタ 番号を設定します。また、FATにはそのクラスタの続きはEOC(クラスタ終了)を格納します。 次に、先ほど確保したクラスタを0で埋めます。ここで、作成したディレクトリが ルートディレクトリであればここでディレクトリの作成は終わります。(ルートディレクトリには ..のエントリが無いのです)もし、作成しているのがルートディレクトリでなければ 初めの2つの32バイトのディレクトリエントリを作成する必要があります。

初めのディレクトリエントリのDIR_Nameは次のようにセットします。
 ".          " 


2つ目のディレクトリエントリのDIR_Nameは次のようにします。
 "..         " 

これらはドット、ドットドットエントリと呼ばれています。どちらのエントリも DIR_FileSizeフィールドは0になっており、日付と時刻はディレクトリを作成した ディレクトリエントリと同じにします。また、ドットエントリに対するDIR_FstClusLOと DIR_FstClusHIは作成したディレクトリのディレクトリエントリにある値と同じにします。

最後に、ドットドットエントリのDIR_FstClusLOとDIR_FstClusHIをディレクトリを作成した ディレクトリの先頭クラスタ番号に設定します。(もしこのディレクトリがルートディレクトリなら この値は0にします。)

ドットエントリとドットドットエントリをまとめると次のようになります。

日付と時刻のフォーマット

多くのFATファイルシステムはDIR_WrtTimeとDIR_WrtDate以外の日付と時刻を 保持していません。その理由はDIR_CrtTimeMil, DIR_CrtTime, DIR_CrtDate, DIR_LstAccDate は実際にはオプションなのです。それに対し、DIR_WrtTimeとDIR_WrtDateは必ず 保持する必要があります。もしその他の日付と時刻を保持しないのであればファイルの作成時に そのような値を保存するフィールドを0にし、ファイルに対する処理では無視するようにします。

日付のフォーマット
FATのディレクトリエントリの日付のスタンプは16ビットのフィールドになっており、 MS-DOSの誕生である1980年1月1日を基準にしています。以下に示しているのが 日付のフォーマットです。(ビット0がLSBでビット15がMSBになっています)
ビット0-4
日を表わしており1から31までの範囲が有効になります。
ビット5-8
月を表わしており1から12までの範囲が有効になります。
ビット9-15
1980からの年を表わします。0から127までの範囲が 有効になります。
時刻のフォーマット
FATのディレクトリエントリの時刻のスタンプは16ビットのフィールドになっており、 最小単位が2秒になっています。以下に示しているのがフォーマットです。
ビット0-4
秒を表わしていますが、2秒ごとのカウントになっています。 0から29までの範囲が有効になります。
ビット5-10
分を表わしており、0から59までの範囲が有効になります。
ビット11-15
時を表わしており、0から23までの範囲が有効になります。
有効な時刻の範囲は深夜00:00:00から23:59:58になります。
inserted by FC2 system