これは最も簡単な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の属性が付いたファイルを持つことが出来ます。 (下記参照)
Name | Offset (byte) | Size (bytes) |
Description | ||||||||||||||
DIR_Name | 0 | 11 | 短い名前 | ||||||||||||||
DIR_Attr | 11 | 1 |
|
||||||||||||||
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ビット長です。 |
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"となります。
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は次のようにセットします。". "
".. "
これらはドット、ドットドットエントリと呼ばれています。どちらのエントリも 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にし、ファイルに対する処理では無視するようにします。