ディレクトリ・エントリ(LFNエントリ含む)
ディレクトリエントリの構成は、以下の通り。
オフセット | 内容 | サイズ |
---|---|---|
0 | 名称 | 11 |
11 | 属性 | 1 |
12 | 予約 | 1 |
13 | 作成時刻ミリ秒(VFAT) | 1 |
14 | 作成時刻(VFAT) | 2 |
16 | 作成日付(VFAT) | 2 |
18 | アクセス日付(VFAT) | 2 |
20 | クラスタ番号上位(FAT32) | 2 |
22 | 更新時刻 | 2 |
24 | 更新日付 | 2 |
26 | クラスタ番号下位 | 2 |
28 | ファイルサイズ | 4 |
- 名称
名称の先頭バイト、つまり、オフセットゼロの1バイトは、識別子になっていて、
-
- 0x00 = 未使用
- 0xE5 = 削除済み
となる。
英語圏では、これで問題なかったが、日本語圏では、漢字コードのうち、
0xE5で始まるコードがあるため、そのままだと、削除済みとみなされてしまうので、
0xE5の替わりに0x05を使用する事にしたようだ。
ここでも、とにかく、互換性第一主義が... 苦笑
ファイル名の読み書きの際は、相互変換(0xE5⇔0x05)を忘れずに行う必要がある。
- 属性
各ビットに次のような意味がある
ビット(値) | 内容 |
---|---|
0(0x01) | READ_ONLY(読み取り専用) |
1(0x02) | HIDDEN(隠しファイル) |
2(0x04) | SYSTEM(システムファイル) |
3(0x08) | VOLUME_ID(ボリュームID) |
4(0x10) | DIRECTORY(ディレクトリ) |
5(0x20) | ARCHIVE(アーカイブ) |
尚、0x0F=ロングファイルネーム属性という、特別な扱いになる。
- 予約
Windows NT では、何やら、利用されているようだが(大文字小文字フラグ?)、
FATの仕様としては、予約領域で、常に0である模様。
- 作成時刻ミリ秒(VFAT)
ファイル作成時刻のミリ秒部分。
作成時刻が2秒単位なので、それを補完する。
単位は10ミリ秒、0〜199の範囲となる。
- 作成時刻(VFAT)
- 更新時刻
時刻のビットフィールドは、HHHH-HMMM-MMMS-SSSS となり、
それぞれ、H(時)=0〜23, M(分)=0〜59, S(秒)=0〜29 の範囲となる。
作成時刻(VFAT)はオプション、更新時刻は必須項目。
- 作成日付(VFAT)
- アクセス日付(VFAT)
- 更新日付
日付のビットフィールドは、YYYY-YYYM-MMMD-DDDD となり、
それぞれ、Y(年)=0〜127(1980年からの経過年), M(月)=1〜12, D(日)=1〜31 の範囲となる。
作成日付(VFAT)・アクセス日付(VFAT)はオプション、更新日付は必須項目。
ファイル内容の実体が存在するクラスタの番号。
FAT32では、上位16bitが追加され、32bit値に拡張された。
- ファイルサイズ
32bit、最大4Gまで。
あちこちに、これまでの苦労を窺える、かなり無理のあるフォーマットになっていますねぇ〜。苦笑
LFN(Long File Name)エントリの構成は、以下の通り。
オフセット | 内容 | サイズ |
---|---|---|
0 | シーケンス番号 | 1 |
1 | ファイル名1(5文字分) | 10 |
11 | 属性 | 1 |
12 | 予約 | 1 |
13 | チェックコード | 1 |
14 | ファイル名2(6文字分) | 12 |
26 | クラスタ番号 | 2 |
28 | ファイル名3(2文字分) | 4 |
- シーケンス番号
ビットフィールドの構成は、DTNN-NNNN、となる。
Dが1の場合は、削除。
Cが1の場合は、最後のシーケンス。
Nは、エントリの順番を表し、1〜63の範囲となる。
- ファイル名1
- ファイル名2
- ファイル名3
Unicodeで合計13文字分のファイル名を格納可能。
- 属性
- 予約
- クラスタ番号
常に、属性=0x0F, 予約=0x00, クラスタ番号=0x0000、となる模様。
- チェックコード
親元となる、8.3形式のファイル名を、一文字ずつ、右ローテートしながら加算していく。(らしい)
LFNエントリは、親元となるディレクトリエントリの前に配置される。
複数のLFNエントリが必要な場合は、更に、後のエントリが前に配置される。
とても不思議なルールのように思えるが、何か、きっと、理由があるんだろうなぁ...