# FAT16

FAT16 (16-bits File Allocation Table) is een bestandssysteem dat gebruikt wordt door onder andere MS-DOS en Microsoft Windows.
Zoals de naam al suggereert werkt FAT met een tabel die op een vaste plek op de schijf opgeslagen is en waarin wordt bijgehouden welke stukken van de schijf door welke bestanden gebruikt worden. De tabel is maximaal 2$^{16}$ (65536) posities groot en bestaat uit 16-bits getallen. In het oorspronkelijk ontwerp kwam iedere positie in de tabel overeen met een enkele sector van 512 bytes, waarmee de grootte van een FAT16-partitie maximaal 32 mebibyte (MiB) kon bedragen. In MS-DOS versie 3.0 werd het mogelijk sectoren samen te voegen in zogenaamde clusters, waardoor harde schijven tot 2 GB gebruikt konden worden (onder Windows NT tot 4 GB).

## Gebruik

FAT16 wordt gebruikt door MS-DOS en Windows op harde schijven en USB-sticks tot 2 GB. Omdat harde schijven tegenwoordig veel groter zijn dan 2 GB, wordt daarvoor geen FAT16 meer gebruikt, maar wel FAT32 of NTFS.

## Hoe werkt het?

Het FAT16-systeem bestaat uit 3 delen:
* de File Allocation Table (FAT)
* de hoofddirectory
* de subdirectory's

### FAT

De File Allocation Table, waarnaar het bestandssysteem genoemd is, volgt onmiddellijk op de bootsector. Meestal staan er twee identieke FAT's vlak achter elkaar, zodat er bij beschadiging van een FAT altijd een reservekopie beschikbaar is.
De FAT-tabel bevat maximaal 65.536 (2$^{16}$) getallen van twee bytes elk (totaal 128 KiB). Elk getal komt overeen met een cluster op de harde schijf, en geeft met een gereserveerde code aan wat de status van de bijbehorende sector of cluster is. Voor een vers geformatteerde schijf is dit voornamelijk de code "leeg" of eventueel "bad". Het laatste betekent dat de cluster beschadigd is en niet gebruikt mag worden.
Bij het aanmaken van een bestand wordt het nummer van de eerste positie bij de informatie over het bestand in de directory opgeslagen. Als het bestand groter is dan één cluster zal in de aangewezen positie het nummer staan van de cluster waar het bestand verdergaat, daar staat weer het nummer van het derde stuk enzovoorts, totdat met een code aangegeven wordt dat het eind van het bestand bereikt is. Als een bestand verwijderd wordt worden alle posities weer als beschikbaar gemarkeerd.
Vereenvoudigd voorbeeld, code 0 is leeg en 99 is "laatste sector". Een cluster is slechts 1 sector groot. De schijf is eerst leeg.
Na het toevoegen van een bestand dat op cluster 1 begint en drie sectoren lang is:
Positie 1 bevat dus het getal "2", dat is het nummer van de volgende cluster waar het bestand verdergaat. Positie 2 bevat het getal "3", en positie 3 bevat de eindcode "99".
Na het toevoegen van nog een bestand dat op 4 begint en twee sectoren lang is:
Na het uitbreiden van bestand 1 met twee sectoren:
In de werkelijkheid wordt voor de "laatste sector" in FAT16 in de plaats van 99 een hexadecimale code gebruikt tussen FFF8$_h$ en FFFF$_h$.

### Directory's

Alle directory's hebben dezelfde vorm. Simpel gesteld is een directory een lijst (de directory-ingangen) van bestandsnamen met het start-clusternummer van dat bestand. Alle directory-entry’s in FAT16 zijn 32 bytes groot.
Er is een verschil tussen de hoofddirectory en alle andere (sub)directory's. Als overblijfsel van MS-DOS versie 1 heeft de hoofddirectory een vaste omvang en staat ze op een vaste plek op de schijf, in tegenstelling tot de latere subdirectory's die door MS-DOS als gewone bestanden worden behandeld die clusters kunnen toewijzen (allocate) en vrijmaken. Bovendien kan de hoofddirectory slechts 512 ingangen bevatten, terwijl andere directory's onbeperkt uitgebreid kunnen worden.
Bij FAT32 is deze beperking voor de hoofddirectory opgeheven, omdat door lange bestandsnamen de hoofddirectory snel vol dreigde te raken.
Alleen een speciale bit in de attribuut-byte bepaalt of een ingang een subdirectory is of een bestand. Directory-ingangen zien er verder gelijk uit voor subdirectory's en voor gewone bestanden, behalve dat van een subdirectory de grootte niet wordt bijgehouden (deze staat op nul). De hoofddirectory begint direct achter (de tweede kopie van) de FAT.
Een subdirectory kent twee speciale ingangen. Dit zijn de huidige directory (current directory), aangeduid met punt (".") en de hogere directory (parent directory), aangeduid met punt-punt (..). De ingang voor de hogere directory staat de gebruiker toe omhoog in de directory-boom te bewegen doordat het besturingssysteem, net als bij bestanden, in de directory-entry het start-clusternummer vindt waar de hogere directory staat opgeslagen. Als de hogere directory de hoofddirectory is dan is zijn clusternummer 0.

### Directory-ingangen

Een directory-ingang is 32 bytes groot en er passen 512 / 32 = 16 directory-ingangen in een blok van 512 bytes. Elke directory-ingang verwijst naar een bestand op de schijf, of naar een andere directory op de schijf. Een directory-ingang ziet er als volgt uit:
| Positie | Lengte (bytes) | Beschrijving | Beschrijving |
| Positie | Lengte (bytes) | FAT | VFAT |
| 0 | 8 | bestandsnaam | bestandsnaam |
| 8 | 3 | extensie | extensie |
| 11 | 1 | attribuut-byte | attribuut-byte |
| 12 | 2 | start-clusternummer (alleen OSR2) | start-clusternummer (alleen OSR2) |
| 14 | 2 | niet gebruikt | creatietijd (alleen VFAT) |
| 16 | 2 | niet gebruikt | creatiedatum (alleen VFAT) |
| 18 | 2 | niet gebruikt | datum laatst gelezen (alleen VFAT) |
| 20 | 2 | gereserveerd | gereserveerd |
| 22 | 2 | tijd laatst beschreven | tijd laatst beschreven |
| 24 | 2 | datum laatst beschreven | datum laatst beschreven |
| 26 | 2 | start-clusternummer van bestand | start-clusternummer van bestand |
| 28 | 4 | bestandsgrootte in aantal bytes | bestandsgrootte in aantal bytes |

### Bestandsnaam en extensie

De bestandsnaam en extensie staan links uitgelijnd in het naamveld en worden naar rechts opgevuld met spaties. De eerste byte van een bestandsnaam heeft een speciale betekenis en geeft de status van de directory-ingang weer.
Van een verwijderd bestand krijgt alleen de eerste byte van de directory-ingang een speciale waarde (E5h). Alle andere informatie in de directory-ingang blijft ongewijzigd en de informatie in de clusters op de schijf wordt niet gewist.

## Problemen

* Na intensief gebruik van een schijf raakt deze gefragmenteerd, wat betekent dat de stukjes van de bestanden niet meer aaneengesloten op de schijf staan.
* Door de manier van administratie is het mogelijk dat series van sectoren of clusters niet als vrij aangegeven zijn, maar ook niet meer via een map te benaderen zijn. Dit noemt men verloren clusters. Met het uitvoeren van het chkdsk- of scandisk-commando konden dergelijke losse stukjes opgespoord en weer benaderbaar gemaakt worden.
* Door de sterke afhankelijkheid van de tabel zou een fysieke beschadiging van het stuk van de schijf waar deze staan rampzalige gevolgen hebben. Om dit te voorkomen wordt er altijd een duplicaat van de tabel opgeslagen.
* Vooral bij gebruik van grote schijven (en dus grote clusters) gaat veel ruimte op de schijf verloren omdat de ruimte altijd in hele clusters toegewezen wordt. Gemiddeld wordt er aan het eind van ieder bestand een halve cluster niet gebruikt, deze ruimte kan niet voor andere bestanden gebruikt worden.
* Het maximale aantal clusters is 65.536, waardoor er dus ook nooit meer dan 65.536 bestanden op een partitie kunnen staan.
* De rootdirectory kan maar 512 elementen bevatten. Probeer je daar onder Windows meer bestanden of mappen neer te zetten, dan komt de melding dat de schijf vol is. Dit komt nog weleens voor bij (oudere) USB-sticks, die soms van fabriekswege met FAT16 zijn geformatteerd.
Een aantal van deze problemen werd opgelost met de opvolger van FAT16: FAT32.