ディレクトリ・エントリ(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エントリが必要な場合は、更に、後のエントリが前に配置される。
とても不思議なルールのように思えるが、何か、きっと、理由があるんだろうなぁ...