FAT

読み:ファット
外語:FAT: File Allocation Table
品詞:名詞

CP/Mで最初に開発され、MS-DOSMicrosoft Windowsで拡張を重ねて使用されているファイルシステム(ディスク管理方法)の一つ。

構造

ディスクは、次の領域に分けられる。

  • ブートセクタ
  • FAT1
  • FAT2
  • ルートディレクトリのディレクトリエントリ
  • データ領域

ディスク上の領域は、クラスタと呼ばれる単位で管理される。このクラスタのつながり状態(リンク情報)をFAT領域に記録することで、データ領域にある実際のデータがディスク上にどのように存在するのかを管理することができる。

クラスタ

ディスクはセクタと呼ばれる単位で構成され、幾つかのセクタをまとめてクラスタとする。ファイルシステムは、セクタ単位ではなく、クラスタ単位でディスクを管理する。

FAT12/16/32

クラスタ番号を記憶するサイズ(ビット数)により幾つか種類がある。

使用するビット数が多いほど、扱えるクラスタ数が増え、大容量ディスクを効率良く管理することができる。

ビット数が多い分だけ管理できるクラスタ数が増え、大容量ディスクが扱えることになるが、その分FAT情報領域が増えてディスク容量を消費してしまうため、媒体の容量に応じたビット数が使われる。

具体的には次の種類がある。

容量の制限

FAT12では20Miバイト程度が最大となり、それ以上の容量のものではFAT16が使われる。

FAT16では1パーティションで2.1Giバイト程度が最大となる。

FAT32では1パーティションで2Tiバイト程度が最大となるが、実装上の問題から32Giバイト程度が限度となる。

exFATでは1パーティションで16Eiバイト程度が最大となる。

ディレクトリエントリ

ファイルの名称等の情報は全て「ディレクトリエントリ」に格納される。

サブディレクトリのディレクトリエントリはファイルと同様の管理が内部でされているが、ディレクトリエントリに「ディレクトリである」というフラグが付けられている。

FATにおける基本的な仕様は次の通り。

  • 8.3形式のファイル名
  • CP/M互換の圧縮日時情報により最小誤差2秒 (2107年12月31日まで対応)
  • ファイルの属性
  • ファイルのサイズ
  • ファイルの開始クラスタ

FATには、2108年問題が存在する。

ファイルの属性

ファイルの属性は、次の種類がある。

エントリの構造

MS-DOS

ディレクトリエントリは一つにつき32バイトであり、次の順に格納される。

  • ファイル名(8バイト)
  • 拡張子(3バイト)
  • ファイル属性(1バイト)
    • ビット7: 未使用(0)
    • ビット6: 未使用(0)
    • ビット5: アーカイブ属性
    • ビット4: ディレクトリ属性
    • ビット3: ボリューム属性
    • ビット2: 隠し属性
    • ビット1: システム属性
    • ビット0: 読み取り専用属性
  • 予約(10バイト)
  • 作成時刻(2バイト)
  • 作成日付(2バイト)
  • 先頭クラスタ(2バイト)
  • ファイルサイズ(4バイト)

この構造は、CP/Mの構造の上位互換である。

Windows NT以降で、予約領域が拡張されている。

Windows NT以降

Windows NT以降では、従来未使用だった領域に情報が書き込まれるようになった。

以下は、Microsoft Extensible Firmware Initiative FAT32 File System Specification外部リンクによる。

  • DIR_Name (短いファイル名)
    • ファイル名 (8バイト)
    • 拡張子 (3バイト)
  • DIR_Attr (ファイル属性) (1バイト)
    • ビット7: 未使用(0)
    • ビット6: 未使用(0)
    • ビット5: アーカイブ属性
    • ビット4: ディレクトリ属性
    • ビット3: ボリューム属性
    • ビット2: 隠し属性
    • ビット1: システム属性
    • ビット0: 読み取り専用属性
  • DIR_NTRes (Windows NT用予約) (1バイト)
    • 常に0
  • DIR_CrtTimeTenth (ファイル作成ミリ秒) (1バイト)
  • DIR_CrtTime (ファイル作成時刻) (2バイト)
  • DIR_CrtDate (ファイル作成日付) (2バイト)
  • DIR_LstAccDate (ファイル最終アクセス日付) (2バイト)
  • DIR_FstClusHI (先頭クラスタHI) (2バイト)
  • DIR_WrtTime (最終更新時刻) (2バイト)
  • DIR_WrtDate (最終更新日付) (2バイト)
  • DIR_FstClusLO (先頭クラスタLO) (2バイト)
  • DIR_FileSize (ファイルサイズ) (4バイト)

日時関係は、次の仕様となる。

  • 作成日時 (ミリ秒単位)
  • 最終アクセス日 (日単位)
  • 最終更新日時 (2秒単位)

最終アクセス日はDIR_LstAccDateに記録されるが、時刻は保存されない。但し書き込みをした場合、DIR_WrtTimeに時刻が書き込まれる。

なお、最終更新日時とされる情報は、旧来のシステム(MS-DOSの時代)にはファイル作成日として使われていた。

ロングファイル名

Windows 95以降で対応したロングファイル名も、同様に1つ以上のディレクトリエントリを用いて情報を記録する。

この旧来に対する拡張情報は、ファイル属性(R+H+S+V)とした特殊な領域に格納される。これは互換性を考慮した結果と思われる。

OSからはVFATという仮想レイヤーを経由してアクセスされる。結果としてディスクがFATであれば、従来と互換性を保つために特殊な隠しファイルとしてファイル属性(R+H+S+V)としたものをディレクトリエントリに書き込む。