File Allocation Table (ファイル・アロケーション・テーブル、FAT、日: ファイル割当て表) とは、MS-DOSのファイルシステム(および、その前身となったMicrosoft DISK-BASICのファイルシステム)におけるディスク内のファイルの位置情報などを記録するための領域である。これが転じて現在ではMS-DOSに採用されていたFATを用いるファイルシステムの名前としてFATファイルシステム、さらにそれを略してFATと呼ぶことも多い(なお後者でDISK-BASICのそれを指すことはまずない)。

## 概要

オリジナルのFile Allocation Tableは1977年に、ビル・ゲイツとマーク・マクドナルドによって開発され、DISK-BASICの中のファイル管理仕様として採用された。

DISK-BASIC以降、MS-DOSのファイルシステムでもFATが採用され、MS-DOSがDOSとしてのデファクトスタンダードを確立し、さらにその後Windows NTで新しいファイルシステムNTFSを普及させた後も、FATを採用したファイルシステムは使われ続けている。

MS-DOS以降は、Windows Meまでの一般家庭向けのOSの標準ファイルフォーマットとして使用されていた。Windows NT系のOSでも使用可能であるが、他のWindowsからのアップグレードやリムーバブルメディアのために用意されているものであり、セキュリティなどの観点から必ずしも利用が推奨されておらず、FATを利用している状況下での動作制限も存在する。

フロッピーディスクの時代の設計を元にしてあるため、ディスク総容量に対し管理領域が少なくて済む、高速にアクセスできるなどの利点があるが、その反面、堅牢でない、大容量ディスクでは非効率、拡張性に乏しい、ファイル名が8文字+拡張子3文字までしか扱えない(VFAT非対応の場合)、タイムスタンプがローカル時間なのでタイムゾーンをまたいで使ったり夏時間・冬時間が違ったりすると正しく(意図した)ファイル変更時刻が表示できないことがあるなど様々な欠点がある。それでも、その特徴と実装の容易さ、読み書きできるオペレーティングシステムが多いことから、フロッピーディスクや小容量メモリーカード用のファイルシステムとして依然使われ続けている。現在はデジタルカメラやビデオゲーム機などでも広く使われている。

FATは、クラスタ番号の管理ビット数によって「FAT12」、「FAT16」、「FAT32」の3種類がある(なお、DISK-BASICでは8ビットであった)。Windowsでは、FAT32を除いてFATと表示している。また、俗に「FAT64」と言う記述を見かけることがあるが、これは「Windows NT系で使用可能なクラスタサイズが64キロバイトのFAT16」または「exFAT」を指し、末尾の数値「64」はクラスタ番号のビット数を示すものではない。

上記のようにリムーバブルメディアのファイルフォーマットとしてはFAT16またはFAT32が多く使用されているが、ボリュームとファイルのサイズ制限が問題になっている。このほか種々の問題を解決するため、exFATが開発された。

なお、VFATとexFATを除いた仕様は国際規格としてECMA-107とISO/IEC 9293として標準化されている。日本ではJIS X 0605規格として登録されている。

## 仕様

フロッピーディスク(後にハードディスクも)の記録単位としてセクタがあり、1以上のセクタをまとめてクラスタとして管理する。FATは言わばクラスタ番号による巨大な一次元配列であり、ディスクの最初から最終までのクラスタ番号ごとに、そのクラスタが使用中なのか、空き領域なのか(または、システム予約領域、バッドクラスタ:エラー)などの状態を保持する。

そして、ディスク上の1つのファイルは、1つ以上のクラスタの連鎖として管理される。すなわち、あるファイルの最初のクラスタ番号がディレクトリ・エントリに格納されており、ファイルの最初のデータはそのクラスタ番号の領域に格納されている。そして、最初のクラスタ番号に対応するFAT上のエントリは、その次に繋がるクラスタ番号を保持するか、またはそこが最終クラスタであるマークを保持している。

このように、FATはディスクの管理上、最重要なデータテーブルであり、もしこの情報が損なわれると、ディスク上のファイル等が正常に読み出せなくなってしまう。そのため、FATを実現しているファイルシステムでは、FATのテーブルの複数のコピーを保持するのが一般的である。

DISK-BASICの時代等は、例えばN-DISK-BASICの場合、FATはマウント命令(BASICのコマンド名は`MOUNT`)によって主記憶に読み込まれて、ファイルの更新とともに主記憶上でだけ更新され、アンマウント命令(BASICのコマンド名は`REMOVE`)によって初めてディスクへ書き戻されるのが一般的であった。これは、ファイルを更新するたびにFATに書き戻すことが無いよう、高速化を図った仕様ではあるが、他方、ユーザーのアンマウント命令の実行忘れにより、FATだけが古い状態のままになり、ファイルの不整合が生じてデータを損なう事故が多発した。

MS-DOS以降では、バッファリング・遅延書き込みにより、ディスクの最終書き込みまでにはFATを必ず自動的に書き戻す仕様になっているため、アクセスの途中にディスクを抜かない限りは、データ不整合が発生するおそれは殆どなくなり、マウント・アンマウントをユーザが意識することはなくなった(ただし、USB接続の大容量リムーバブルメディアの普及により、遅延書き込みのフラッシュの保証のために、「ハードウェアの安全な取り外し」として再認識されるに至っている)。

## 実装

MS-DOS起源のFATファイルシステムの実装でも同様に、記憶ディスク上のセクタはクラスタと呼ばれる単位にまとめられ、1クラスタ内のセクタはディスク上では物理的に連続している。

FATはディスク上では最初の方に配置している(ブートローダ、システムイメージの次あたり)。FATとは別に、ルートディレクトリテーブルが存在する。これもFATの近傍に配置され、ルートディレクトリのディレクトリ・エントリを保持する。ディレクトリ・エントリは、ファイル名とファイルの属性、そのファイルを構成する最初のクラスタ番号を保持する。

なお、サブディレクトリは、ルートディレクトリ(およびサブディレクトリ)に存在する特殊なファイル・エントリとして実現される。すなわち、例えば\subdir は、ルート (\) ディレクトリーテーブルにsubdirのディレクトリ・エントリが存在し、かつ、そのエントリが表現するファイルそのものをディレクトリテーブルと見なして処理する。サブディレクトリのサブディレクトリ(例:\subdir\subdir)も同様である。

ともかく、ディレクトリ・エントリに記録された先頭クラスタ番号と、その番号が指し示すFAT上のエントリを組み合わせることにより、1つのファイルが複数のクラスタにまたがって存在する状況を記録している。

なお、FAT上のエントリには、続きのクラスタ番号の他に、一部予約番号も記録される。それは以下の通りである(以下の数値はFAT16の場合)。

- 0000h: 未使用クラスタである
- 0001h: (予約)
- FFF7h: 不良クラスタとしてマークされている
- FFF8h - FFFFh: 最後のクラスタである

なお、FATの多重化数は2である。ただし、通常は、多重化FAT間の不整合が、自動で検出されることはなく、手動で検査・修復プログラムを実行する必要がある。

### FAT12

当初のFATファイルシステムは、現在はFAT12と呼ばれている。12ビットのクラスタ識別子を利用し、総クラスタ数は最大4084個である。クラスタサイズは512バイトから32KiBまで使用することが出来る。しかし、ボリュームの総セクタ数が16ビットで管理されているため、セクタサイズが512バイトの場合、ボリュームサイズは32MiBまでとなる。現在は主にフロッピーディスクのフォーマットとして残されている。

### FAT16

FAT16は、16ビットのクラスタ識別子を利用したFATで、総クラスタ数は最大65,524個である。クラスタサイズは512バイトから32KiB(NT系では64KiB)まで使用できる。ボリュームサイズは2GiB(NT系では4GiB)までとなる。当初はボリュームの総セクタ数がFAT12と同様に16ビットで管理されていたため、セクタサイズが512バイトの場合、ボリュームサイズは32MiBまでであったが、Compaq DOS 3.31で総セクタ数を32ビットで管理するように拡張され、この制限は取り払われた。

MS-DOSは4.0以降で32ビットの総セクタ数に対応したが、日本国内ではPC-98用のMS-DOS 4.0は発売されず、32ビットセクタへの対応はMS-DOS 5.0まで待たされることとなった。代わりに、PC-98用のMS-DOS 3.3では、512バイトの物理セクタを4個まとめて2KiBの論理セクタとして扱うことで、128MiBまでのボリュームサイズに対応していた。また、セイコーエプソンがPC-286シリーズ用のMS-DOS4.01を発売しており、これをPC-9800シリーズで使うこともできた。

### VFAT

VFAT (Virtual FAT) は「長いファイル名」(Long File Name, LFN) をFAT (12/16/32)で扱えるようにする拡張である。LFNでは、Windows NT 3.5およびWindows 95から実装された機能で、これにより最大255文字(UTF-16 LEで処理されるので1文字2バイト)までのファイル名を付与できる(ただし、Windows 9x系では実装上255バイトまでしか扱えない)。ファイルシステム上はディレクトリエントリの扱いが若干異なる程度で、下位互換性も不十分ながら保たれている。

VFATはFAT互換の8.3形式の短いファイル名の直前のディレクトリエントリにボリュームラベルビットの立ったエントリが存在した場合、それがこのファイルの長いファイル名であると解釈する。そのため、従来のFATしかサポートしないOSからVFATを参照した場合には、短いファイル名のみが見えることとなり、一応のアクセスは可能となる。しかし、ファイルの書き込みを行ったり、MS-DOS時代のディレクトリエントリを最適化するプログラムやツールを使用した場合、長いファイル名が破壊されてしまうため、互換性が不十分であると言われている。

本稿ではVFATをLFNの拡張機能としているが、厳密にいうと、当初VFATとはWindows 3.1からWindows Meと引き継がれてきた仮想デバイスドライバの1つ (VFAT.VXD) を意味した。これは、(プロテクトモードで動作する)Windowsアプリケーション上からMS-DOSファイルをアクセスする時に、(リアルモードで動作する)MS-DOSシステムを呼ばずに済むようにするためのものである。初期のVFATドライバ(Windows 95よりも前)では、LFNをサポートしていない。

### FAT32

FAT32は、Windows 95 OSR2で登場し、32ビット化されたFATである。32ビットのクラスタ識別子を利用し管理するが、上位4ビット分は予約としており、28ビットでの管理となる。クラスタサイズは4KiBから32KiBまで使用できる。ボリュームサイズは理論上8TiBまでとなる。しかし、ボリュームの総セクタ数を32ビットで管理(最大4,294,967,295)しているため、セクタサイズが512バイトの場合にボリュームサイズは2TiBに制限される。

クラスタは28ビットのため、論理上268,435,444個のクラスタを扱えるはずであるが、スキャンディスクの実装上の問題でWindows 9x系上では事実上4,177,920個のクラスタしか利用できない(32KiBクラスタ時、およそ124.55GiB)。なお、Windows 9x系に付属するパーティション作成ツールであるFDISKでは64GB以上のFAT32パーティションを作成できず、これに対応させる修正版が公開されている。

Windows NT系ではWindows 2000から利用可能となったが、新規のフォーマット作業では意図的に32GiBまでの制限を設けている。そのため、32GiBを超えるサイズのボリュームを作成するには、サードパーティー製のフォーマットツールを利用する必要がある。

Windows 11のビルド 27686で、32GiBの上限が解除され、2TiBまでの利用が可能になった。ただし、このビルドはプレビュー版であり、一般向けの最新バージョンであるバージョン 24H2(ビルド 26100)では、32GiBの制限が残っている。

### exFAT

exFAT (Extended File Allocation Table) はWindows Embedded CE 6.0で導入されたフラッシュドライブ向けに最適化された新しい規格のFATである(従来のFATとの互換性はない)。NTFSの使用がオーバーヘッドから適切ではない用途に向け開発された。Transaction-Safe FAT File System (TFAT) の活用も可能である。Windows Embedded CE 6.0の下では TFAT はexFAT 上でのみサポートされる。Windows XPとVistaでも、後に使用可能になった。Windows XPでは更新プログラム(SP1以前は利用不可)、VistaはService Pack 1でexFAT対応が追加される。4GiBまでであった1ファイルあたりのサイズ制限は撤廃され、16EiBまで利用可能となる。実装次第でNTFSの様なセキュリティACLやジャーナルを備えることも可能となっている。また、8.3形式のファイル名は削除された。