檔案配置表(英語:File Allocation Table,首字母縮略字:FAT),是一種由微軟發明並擁有部分專利[2] 的檔案系統,供MS-DOS使用,也是所有非NT核心的Windows系統使用的檔案系統。
FAT | |||
---|---|---|---|
開發商 | 微軟 | ||
全名 | 檔案配置表 | ||
(12位元版本) | (16位元版本) | (32位元版本) | |
發布 | 早於1980年 (微軟Disk BASIC) |
1987年11月 (Compaq DOS 3.31) |
1996年8月 (Windows 95 OSR2) |
分割區標識 | 0x01(MBR) | 0x04, 0x06, 0x0E(MBR) | 0x0B, 0x0C(MBR) EBD0A0A2-B9E5-4433 -87C0-68B6B72699C7(GPT) |
結構 | FAT12 | FAT16 | FAT32 |
目錄內容 | 表格 | ||
檔案組態 | 連結串列 | ||
壞塊 | 對含損壞磁區的叢集加以標誌 | ||
限制 | FAT12 | FAT16 | FAT32 |
最大檔案大小 | 32 MB | 2 GB | 4 GB - 1 byte (232-1) |
最大檔案數量 | 4,077 (212-19) |
65,517 (216-19) |
268,435,437 (228-19) |
最長檔名限制 | 8.3或者 長檔名255個字元 | ||
最大卷大小 | 32 MB | 2 GB, 使用64KB叢集時可達4 GB,但非所有系統均支援 |
2 TB 使用32KB叢集時可達8 TB |
Features | FAT12 | FAT16 | FAT32 |
記錄日期 | 建立、修改、訪問 | ||
日期範圍 | 1980年1月1日至2107年12月31日 | ||
日期解析度 | 2 s | ||
岔流 | 非原生 | ||
屬性 | 唯讀,隱藏,系統,卷標,子目錄,歸檔[1] | ||
透明壓縮 | Per-volume, Stacker,DoubleSpace,DriveSpace | 無 | |
透明加密 | Per-volume only with DR-DOS | 無 |
FAT檔案系統考慮當時電腦效能有限,所以未被複雜化,因此幾乎所有個人電腦的作業系統都支援。這特性使它成為理想的軟碟和記憶卡檔案系統,也適合用作不同作業系統中的資料交流。
但FAT有一個嚴重的缺點:當檔案刪除後寫入新資料,FAT不會將檔案整理成完整片段再寫入,長期使用後會使檔案資料變得逐漸分散,而減慢了讀寫速度。磁碟重組是一種解決方法,但必須經常磁碟重組來保持FAT檔案系統的效率。
歷史
FAT檔案系統遵行已用了多年的軟體方法來進行規範。它在1977年由比爾·蓋茲和馬斯·麥當勞為了管理磁碟而發明,並在1980年被添·彼得遜的86-DOS作業系統採用。這也是86-DOS作業系統與CP/M作業系統最大的不同點,若非此項差異,86-DOS作業系統與CP/M作業系統幾乎可說完全相同。[3]
初期的FAT就是現在俗稱的FAT12。作為軟碟的檔案系統,它有幾項限制:不支援分層性結構,叢集定址只有12位元(這使得控制FAT有些棘手)而且只支援最多32M(216)的分割區。
當時入門級的磁碟是5.25"、單面、40磁軌、每個磁軌8個磁區、容量略少於160KB。上面的限制超過了這個容量一個或幾個數量級,同時允許將所有的控制結構放在第一個磁軌,這樣在讀寫操作時移動磁頭。這些限制在隨後的幾年時間裡被逐步增大。
由於唯一的根目錄也必須放在第一個磁軌,能夠存放的檔案個數就限制在幾十個。
MS-DOS 2.0為了支援以內建10MB硬碟為特色的IBM PC XT,因此幾乎與該電腦同時在1983年初發布。它引進了層次目錄結構,除了允許更有效率地組織檔案外,目錄允許在硬碟上儲存更多的檔案,這是因為最大檔案個數不再受制於(仍然是固定且有限的)根目錄大小。這個數目現在能夠等同於叢集的數目(甚至更大,這是考慮到長度為0的檔案並不占據任何FAT叢集)。
FAT本身的格式並沒有改變。PC XT的10MB的硬碟有4KB大小的叢集。如果後來安裝了一個20MB的硬碟,並且使用MS-DOS 2.0格式化,最後的叢集大小將變為8KB,硬碟容量將變為15.9MB。
在1984年,IBM發布PC AT,內含一個20MB的硬碟。微軟公司也同步發布了MS-DOS 3.0。叢集集位址增加至16位元,允許更大數量的叢集(最大65,517),所以有更大的檔案系統大小。但是,最大數量磁區及最大分割區(相當於磁碟)的大小仍是32MB。所以,儘管技術上已經是「FAT16」,這種格式並不是我們今天常見到的這個名字所代表的格式。在MS-DOS 3.0格式化一個20 MB的硬碟,這硬碟將不能被MS-DOS 2.0或之前的版本所存取。當然,MS-DOS 3.0仍然可存取MS-DOS 2.0的格式(8KB叢集的分割區)。
MS-DOS 3.0也開始支援高密度1.2MB 5.25"磁碟,最著名的是每個磁軌有15個磁區,這樣就允許FAT有更大的空間。這或許促進了一個對於叢集大小的不確定的最佳化,叢集大小從2個磁區減到1個。這樣做的最後結果是高密度磁碟比舊的雙密度磁碟的速度大幅度降低。
除了改進FAT檔案系統本身的結構之外,另一個提高FAT儲存空間的方式是支援多個磁碟分割區。最初,受限於主開機紀錄中檔案配置表的固定結構一個硬碟最多只能切出多達4個分割區。然而,由於DOS設計要求只能有一個分割區標識為「活動的(Active)」,它也是主引導代碼啟動所用的分割區。使用DOS工具不可能建立幾個「主」DOS分割區,並且第三方的工具也至少會警告這樣一個機制將與DOS不相容。
為了用一種相容的方式使用更多的分割區,一種新的分割區類型被開發出來(1986年1月的MS-DOS 3.2),擴充分割區它實際上是另外稱為邏輯分割區的一個容器。最初它裡面只允許有一個邏輯分割區、支援最大64MB的硬碟。在MS-DOS 3.3(1987年8月)這個限制更改到24個分割區;它可能來自於強制性的C:-Z:的磁碟命名規則。邏輯分割區表使用盤上的資料結構來描述,可能是為了簡化編碼它與主開機紀錄非常相似,並且它們組織成類似於俄羅斯套娃那樣的結構。一顆硬碟中只能有一個擴充分割區。
在擴充分割區觀念匯入之前,一些硬碟控制器(當時採用獨立的硬碟控制卡,IDE標準尚未出現)能夠將大硬碟顯示為兩個獨立的硬碟。
1987年11月,我們今天稱之為FAT的格式最終到來,它在康柏DOS 3.31中去掉了磁碟磁區的16位元計數器。這個結果曾經一度被稱為DOS 3.31大檔案系統。儘管看起來磁碟上的變動很小,這個DOS的磁碟代碼都必須檢查並轉換到32位元的磁區數,由於它完全是16位元的組合語言這樣一個現實,這項工作就變得非常複雜。
1988年,這項改進通過MS-DOS 4.0得到廣泛應用。現在分割區大小受限於每個叢集的8位元有符號磁區計數,它最大能達到2的64次方,對於一個常用的有32KB個叢集每磁區512位元組的硬碟來說,將FAT16分割區大小的「明顯」限制擴充到2GB。在磁光碟媒體上,它能使用1或者2KB的磁區,這樣大小限制也就成比例地增大。
後來,Windows NT通過將每個叢集的磁區數當作無符號數將最大的叢集大小增加到64KB。然而這個格式與當時其它任何格式的FAT都不相容,並且這樣的操作會產生大量的內部碎片。Windows 98也支援這種格式的讀寫操作,但是它的磁碟管理工具不支援這種格式。
Windows 95設計人員的一個使用者體驗目標就是:除了傳統的8.3檔名以外,在新作業系統中使用長檔名(LFN)。長檔名通過在目錄條目排列時,使用一個工作區來實現(參見下面)。按照Windows 95VxD裝置驅動程式的命名規則,這個新擴充的檔案系統通常稱為VFAT。
有意思的是,VFAT驅動在早於Windows 95的Windows for Groups 3.11中就已經出現,但它僅僅用於實現32位元檔案訪問,一個繞過DOS的視窗內建高效能保護模式檔案管理系統,它能夠直接使用BIOS或者更好的32位元磁碟訪問,如Windows內建的保護模式磁碟驅動程式。它是一個後門;微軟為Windows for Groups 3.11所作的廣告說32位元檔案訪問基於「芝加哥專案的32位元檔案系統」。
在Windows NT中,FAT檔案系統對於長檔名的支援從3.5版就已經開始了。在MS-DOS 7.0以後的版本中,則可使用類似DOSLFN這樣的軟體使得DIR等命令顯示出長檔名。
為了解決FAT16對於卷大小的限制同時讓DOS的真實模式在非必要情況下不減少可用常規主記憶體狀況下處理這種格式,微軟公司決定實施新一代的FAT,它被稱為FAT32,帶有32位元的叢集數,目前用了其中的28位元。
理論上,這將支援總數達268,435,438(<228)的叢集,允許磁碟容量達到8TB。
FAT32隨著Windows 95 OSR2發布,儘管需要重新格式化才能使用這種格式並且DriveSpace 3(Windows 95 OSR2和Windows 98所帶版本)從來都不支援這種格式。Windows 98提供了一個工具用來在不遺失資料的情況下將現有的硬碟從FAT16轉到FAT32格式。在NT產品線上對於它的支援從Windows 2000開始。
Windows 2000和Windows XP能夠讀寫任何大小的FAT32檔案系統,但是這些平台上的格式化程式只能建立最大32GB的FAT32檔案系統。Thompson and Thompson(2003)寫道「奇怪的是微軟公司說這種現象是故意設計的」[4] 微軟公司知識庫文章184006[5]的確是這麼說的,但是沒有提出任何關於這個限制的合理解釋。Peter Norton的觀點是「微軟公司在有意地削弱FAT32檔案系統」[6]。
原微軟開發者Dave Plummer於2024年3月25日在twitter稱,將FAT卷的大小限制在32GB是他臨時設定的,相關格式化對話方塊就是他寫的[7]。
2024年8月15日,微軟在Windows 11 Insider Preview Build 27686發布公告中,宣布取消了FAT32分割區大小限制,使用者可以在命令列中使用format命令格式化最大2TB的FAT32分割區,但圖形介面的格式化對話方塊仍然只支援32GB[8]。
在Windows Embedded CE 6.0中引入,Windows XP SP3 以及 Windows Vista SP1也引入了exFAT的支援。在很多方面exFAT有了相當大的改進,特別適合用於快閃記憶體。
其它IBM PC的可選作業系統,如Linux、FreeBSD和BeOS都支援FAT格式,並且大部分都在相應的Windows版本發布以後很快就支援VFAT和FAT32格式。早期的Linux發布版本還包括稱為UMSDOS的格式,它是儲存在一個獨立的稱為--linux-.——的帶有Unix檔案屬性(如長檔名和訪問許可)的FAT。UMSDOS在VFAT發布以後就不再使用。Linux核心從2.5.7開始就禁止了這項功能。Mac OS X作業系統在除啟動磁碟之外的其它卷上也支援FAT檔案系統。
FAT檔案系統本身不是為支援ADS而設計的,但是一些高度依賴它們的作業系統創造出了不同的方法以在FAT驅動器上處理它們。這些方法或者在額外的檔案或路徑中儲存附加的資訊(Mac OS),或者給那些磁碟資料結構中以前沒有使用的變數賦予新的含義(OS/2和Windows NT)。第二種設計,儘管想像起來會更有效率,但是它們不能被不認識這種格式的工具複製或者備份;使用不能辨識這種格式的磁碟工具(如碎片整理或CHKDSK)操控這些磁碟時可能會破壞這些資訊。
Mac OS使用PC Exchange儲存不同的資料,檔案屬性和檔名存在一個名為FINDER.DAT的隱藏檔案中,資源分支(ADS)存在名為RESSOURCE.FRK的子目錄中,這些資料都存在使用它們的每個目錄中。從PC Exchange 2.1開始,它們將Mac OS的長檔名儲存為標準的FAT長檔名,並且將超過31個字元的FAT長檔名轉換為唯一的31字元能夠被Macintosh應用程式辨識的檔名。
Mac OS X將元資料(資源分支、不同的ADS、檔案屬性)儲存在與所有人相同並以「._」開始的名字的隱藏檔案中,並且Finder將一些資料夾和檔案元資料存在名為「.DS Store」的隱藏檔案中。
OS/2高度依賴於擴充屬性(EA)並且將它們存在位於FAT12或FAT16的根目錄下名為「EA DATA. SF」的隱藏檔案中。這個檔案使用以前檔案(或者目錄)的目錄清單中的兩個保留位元組索引。在FAT32格式中,這些位元組中存有檔案或者目錄開始叢集號的高16位元,這樣就使它難於在FAT32上儲存EA。擴充屬性可以通過Workplace Shell桌面、REXX指令碼、許多系統圖形使用者介面和命令列工具(如4OS2)來訪問。
Windows NT支援HPFS、NTFS和FAT中所有擴充屬性的處理(所用處理機制完全類似於OS/2),但是不能處理其它一些存於NTFS驅動器的ADS資料。試圖從複製帶有與NTFS驅動器屬性不同擴充屬性的ADS到FAT驅動器將報告一個警告資訊提示ADS將會遺失。
Windows 2000以後產品的處理類似於Windows NT但複製到FAT32時它們沒有顯示任何警告資訊直接丟棄擴充屬性(但報告其他像「Macintosh Finder Info」和「Macintosh Resource Fork」這些ADS引起的警告)。
微軟公司最近獲得了VFAT和FAT32的專利(但沒有得到最初的FAT的專利),這引起了人們對於微軟將會對Linux OS發布和初始化他們產品的媒體廠商收取專利費的擔憂(參見下面的FAT授權協定)。儘管最初的裁定不利於微軟公司,但是微軟仍然取得了勝利並且得到了專利授權。
由於微軟公司已經宣布不再開發基於MS-DOS作業系統Windows Me的後續版本,所以不再有可能會有新版的FAT。對於大多數用途來說,為Windows NT系列開發的NTFS檔案系統從效率、效能、安全性及可靠性來說都優於FAT;它的主要缺點是小容量檔案所占的額外空間以及除了基於NT的Windows作業系統之外的很少有其他作業系統支援。由於確切的規範是微軟公司的商業秘密,這就使得使用一個DOS軟碟用於恢復目的很困難(根據微軟MCSE訓練教材說明此點是刻意保密,以確保NTFS檔案系統不易被盜取資料)。微軟公司提供了一個恢復介面來解決這個問題,由於安全的原因它嚴重限制了預設情況下它所能解決的問題。
FAT仍然是移動媒體所常用的一種檔案系統(CD和DVD是例外),軟碟使用的是FAT12,其他多數活動媒體用的是FAT32(如用於數位相機的快閃記憶卡和USB隨身碟,Windows格式化的預設選項仍為FAT32),除非其容量超出FAT32的限制。出於相容性和儲存空間利用率的考慮FAT仍然用在這些驅動器上,同時也是由於這些活動媒體上的檔案的許可更容易遇到麻煩而不是更重要這樣一個事實。
Windows 2000和XP支援的FAT32格式化的限制是32GB,這導致使用現代硬碟的使用者必須要麼使用NTFS要麼使用其它程式格式化驅動器。一個解決的辦法是使用從Linux移植到Windows平台的一個工具mkdosfs。
設計
一個FAT分割區或磁碟的結構布局 | |||||||
內容 | 主啟動區 | 檔案系統資訊磁區 (僅FAT32) | 額外的保留空間(可選) | 檔案配置表#1 | 檔案配置表#2 ...(可組態) | 根目錄(僅FAT12/FAT16) | 其他所有資料... |
大小(位元組) | 保留磁區數*磁區大小 | 檔案配置表磁區數* 磁區大小 | 檔案配置表磁區數* 磁區大小 | 根目錄條目數量*32(按磁區大小向上取整) | 剩下的磁碟空間 |
一個FAT檔案系統包括四個不同的部分。
- 保留磁區,位於最開始的位置。 第一個保留磁區是引導磁區(分割區啟動記錄)。它包括一個稱為基本輸入輸出參數塊的區域(包括一些基本的檔案系統資訊尤其是它的類型和其它指向其它磁區的指標),通常包括作業系統的啟動呼叫代碼。保留磁區的總數記錄在引導磁區中的一個參數中。引導磁區中的重要資訊可以被DOS和OS/2中稱為驅動器參數塊的作業系統結構訪問。
- FAT區域。它包含有兩份檔案配置表,這是出於系統冗餘考慮,儘管它很少使用,即使是磁碟修復工具也很少使用它。它是分割區資訊的對映表,指示叢集是如何儲存的。
- 根目錄區域。它是在根目錄中儲存檔案和目錄資訊的目錄表。在FAT32下它可以存在分割區中的任何位置,但是在早期的版本中它永遠緊隨FAT區域之後。
- 資料區域。這是實際的檔案和目錄資料儲存的區域,它占據了分割區的絕大部分。通過簡單地在FAT中添加檔案連結的個數可以任意增加檔案大小和子目錄個數(只要有空叢集存在)。然而需要注意的是每個叢集只能被一個檔案占有,這樣的話如果在32KB大小的叢集中有一個1KB大小的檔案,那麼31KB的空間就浪費掉了。
格式如下
偏移(位元組) | 長度(位元組) | 說明 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 3 | 跳轉指令(跳過開頭一段區域) | ||||||||||||||||
0x03 | 8 | OEM名稱(空格補齊)。MS-DOS檢查這個區域以確定使用啟動記錄中的哪一部分資料 [3] (頁面存檔備份,存於網際網路檔案館) 。常見值是IBM 3.3 (在「IBM」和「3.3」之間有兩個空格)和MSDOS5.0 .
| ||||||||||||||||
0x0b | 2 | 每個磁區的位元組數。基本輸入輸出系統參數塊從這裡開始。 | ||||||||||||||||
0x0d | 1 | 每叢集磁區數 | ||||||||||||||||
0x0e | 2 | 保留磁區數(包括啟動磁區) | ||||||||||||||||
0x10 | 1 | 檔案配置表數目 | ||||||||||||||||
0x11 | 2 | 最大根目錄條目個數 | ||||||||||||||||
0x13 | 2 | 總磁區數(如果是0,就使用偏移0x20處的4位元組值) | ||||||||||||||||
0x15 | 1 | 媒介描述
同樣的媒介描述必須在重複複製到每份FAT的第一個位元組。有些作業系統(MSX-DOS 1.0版)全部忽略啟動磁區參數,而僅僅使用FAT的第一個位元組的媒介描述確定檔案系統參數。 | ||||||||||||||||
0x16 | 2 | 每個檔案配置表的磁區(FAT16) | ||||||||||||||||
0x18 | 2 | 每磁軌的磁區 | ||||||||||||||||
0x1a | 2 | 磁頭數 | ||||||||||||||||
0x1c | 4 | 隱藏磁區 | ||||||||||||||||
0x20 | 4 | 總磁區數(如果超過65535,參見偏移0x13) | ||||||||||||||||
0x24 | 4 | 每個檔案配置表的磁區(FAT32)。擴充基本輸入輸出系統參數塊從這裡開始。 | ||||||||||||||||
0x24 | 1 | 物理驅動器個數(FAT16) | ||||||||||||||||
0x25 | 1 | 當前磁頭(FAT16) | ||||||||||||||||
0x26 | 1 | 簽章(FAT16) | ||||||||||||||||
0x27 | 4 | ID(FAT16) | ||||||||||||||||
0x28 | 2 | Flags(FAT32) | ||||||||||||||||
0x2a | 2 | 版本號(FAT32) | ||||||||||||||||
0x2c | 4 | 根目錄啟始叢集(FAT32) | ||||||||||||||||
0x2b | 11 | 卷標(非FAT32) | ||||||||||||||||
0x30 | 2 | FSInfo扇區(FAT32) | ||||||||||||||||
0x32 | 2 | 啟動扇區備份(FAT32) | ||||||||||||||||
0x34 | 12 | 保留未使用(FAT32) | ||||||||||||||||
0x36 | 8 | FAT檔案系統類型(如FAT、FAT12、FAT16) | ||||||||||||||||
0x3e | 2 | 作業系統自引導代碼 | ||||||||||||||||
0x40 | 1 | BIOS裝置代號(FAT32) | ||||||||||||||||
0x41 | 1 | 未使用(FAT32) | ||||||||||||||||
0x42 | 1 | 標記(FAT32) | ||||||||||||||||
0x43 | 4 | 卷序號(FAT32) | ||||||||||||||||
0x47 | 11 | 卷標(FAT32) | ||||||||||||||||
0x52 | 8 | FAT檔案系統類型(FAT32) | ||||||||||||||||
0x1FE | 2 | 磁區結束符(0x55 0xAA) |
這裡描述的啟動磁區能在如OS/2 1.3的啟動磁碟上看到。早期的版本使用一個較短的基本輸入輸出系統參數塊,它們的啟動代碼在前面開始(如OS/2 1.1中是偏移0x2b)。
Apricot PC的MS-DOS所用FAT的實現有一個不同的啟動磁區組織以使用電腦與IBM不相容的基本輸入輸出系統。跳轉指令和OEM名被省略並且MS-DOS檔案系統參數位於0x50(在標準磁區中偏移為0x0B - 0x17)。後來的Apricot MS-DOS版本除了Apricot特有的引導區之外也具有了讀寫標準啟動分割區的能力。
BBC Master 512上的DOS Plus根本就不使用傳統的引導區。資料磁碟省略了引導區並且以一個單份的FAT開始(FAT的第一個位元組用來確定磁碟容量),啟動磁碟使用一個包含啟動呼叫程式的小型ADFS檔案系統,後面跟隨一個單份的FAT。
一個分割區分成同等大小的叢集,也就是連續空間的小塊。叢集的大小隨著FAT檔案系統的類型以及分割區大小而不同,典型的叢集大小介於2KB到32KB之間。每個檔案根據它的大小可能占有一個或者多個叢集;這樣,一個檔案就由這些這些(稱為單向鏈結串列)叢集鏈所表示。然而,這些鏈並不一定一個接著一個在磁碟上儲存,它們經常是在整個資料區域零散的儲存。
檔案配置表(FAT)是對映到分割區每個叢集的條目列表。每個條目記錄下面五種資訊中的一種。
- 鏈中下一個叢集的位址
- 一個特殊的叢集鏈結束符(EOC,End Of Cluster-chain,或稱End Of Chain)符號指示鏈的結束
- 一個特殊的符號標示壞叢集
- 一個特殊的符號標示保留叢集
- 0來表示空閒叢集
每個版本的FAT檔案系統使用不同大小的FAT條目。這個大小已經由名字表示出來,例如FAT16檔案系統的每個條目使用16位元表示,32位元檔案系統使用32位元表示。這個不同意味著FAT32系統的檔案配置表能比FAT16對映更多的叢集,它也允許FAT32有更大的分割區大小。這也使得FAT32比FAT16更能有效地利用磁碟空間,因為每個驅動器能夠定址更小的叢集,這也就意味著更少的空間浪費。
FAT條目值:
FAT12 | FAT16 | FAT32 | 描述 |
---|---|---|---|
0x000 | 0x0000 | 0x?0000000 | 空閒叢集 |
0x001 | 0x0001 | 0x?0000001 | 保留叢集 |
0x002 - 0xFEF | 0x0002 - 0xFFEF | 0x?0000002 - 0x?FFFFFEF | 被占用的叢集;指向下一個叢集 |
0xFF0 - 0xFF6 | 0xFFF0 - 0xFFF6 | 0x?FFFFFF0 - 0x?FFFFFF6 | 保留值 |
0xFF7 | 0xFFF7 | 0x?FFFFFF7 | 壞叢集 |
0xFF8 - 0xFFF | 0xFFF8 - 0xFFFF | 0x?FFFFFF8 - 0x?FFFFFFF | 檔案最後一個叢集 |
注意FAT32隻使用32位元中的28位元。高4位元通常是0但它們是保留位,不要更改它們。在上面的表中它們用問號表示。
目錄表是一個表示目錄的特殊類型檔案(現今通常稱為資料夾)。它裡面儲存的每個檔案或目錄使用表中的32位元組條目表示。每個條目記錄名字、副檔名、屬性(檔案、目錄、隱藏、唯讀、系統和卷)、建立的日期和時間、檔案/目錄資料第一個叢集的位址,最後是檔案/目錄的大小。
除了FAT12和FAT16檔案系統中的根目錄表占據特殊的根目錄區域位置之外,所有其它的目錄表都存在資料區域。
合法的DOS檔名包括下面一些字元:
- 大寫字母A-Z
- 數字0-9
- 空格(儘管結尾的空格被作為填充而不是檔名的一部分)
- ! # $ % & ( ) - @ ^ _ ` { } ~ '
- 數值128-255
DOS檔名位於OEM字元集。
位於根目錄區域和子目錄區域的目錄條目都是下面的格式:
位元組偏移 | 長度 | 描述 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 8 | DOS檔名(附加空格)
第一個位元組可以是下面的特殊數值:
| |||||||||||||||||||||||||||
0x08 | 3 | DOS副檔名(空格補齊) | |||||||||||||||||||||||||||
0x0b | 1 | 檔案屬性
第一個位元組可以是下面一些特殊值:
屬性值0x0F用來表示長檔名條目。 | |||||||||||||||||||||||||||
0x0c | 1 | 保留,NT使用(參見後面) | |||||||||||||||||||||||||||
0x0d | 1 | 建立時間,最小時間解析度:10ms單位,數值從0到199。 | |||||||||||||||||||||||||||
0x0e | 2 | 建立時間。小時、分鐘和秒根據後面的圖示描述進行編碼:
注意秒只儲存了2秒的解析度。更細解析度的檔案建立時間在偏移0x0d處。 | |||||||||||||||||||||||||||
0x10 | 2 | 建立日期。年、月和日根據後面的圖示編碼:
| |||||||||||||||||||||||||||
0x12 | 2 | 最近訪問日期;參見偏移0x10處的描述。 | |||||||||||||||||||||||||||
0x14 | 2 | FAT12和FAT16中的EA-Index(OS/2和NT使用),FAT32中第一個叢集的兩個高位元組 | |||||||||||||||||||||||||||
0x16 | 2 | 最後更改時間;參見偏移0x0e處的描述。 | |||||||||||||||||||||||||||
0x18 | 2 | 最後更改日期; 參見偏移0x10處的描述。 | |||||||||||||||||||||||||||
0x1a | 2 | FAT12和FAT16中的第一個叢集。FAT32中第一個叢集的兩個低位元組。 | |||||||||||||||||||||||||||
0x1c | 4 | 檔案大小 |
長檔名(LFN)使用一個技巧儲存在FAT檔案系統上——在目錄表中添加假的條目。這些條目使用一個普通檔案無法使用的卷標屬性標識,普通檔案無法使用是由於它們被大多數舊的MS-DOS程式忽略。很顯然,一個只包含卷標的目錄被當作空卷,這樣就允許刪除;使用長檔名建立的檔案在從普通的DOS刪除就會發生這樣的情形。
校驗和也允許檢驗長檔名是否與8.3檔名匹配;當一個檔案刪除之後使用DOS在同一個目錄位置重新建立之後就會出現不匹配現象。校驗和使用下面的演算法計算。(注意pFcbName是指向如正常目錄條目中所顯示的檔名的指標,例如前八個字元是檔名,最後三個是副檔名。點是隱含的。檔名中沒有使用的空間將使用空格(ASCII 0x20)補齊。例如,「Readme.txt」將記錄為"README TXT"。
unsigned char lfn_checksum (const unsigned char *pFcbName)
{
int i;
unsigned char sum=0;
for (i=11; i; i--)
sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *pFcbName++;
return sum;
}
舊版的PC-DOS錯誤地將根目錄中的長檔名當作卷標,這樣它們就會顯示錯誤的卷標。
每個假條目包含13UTF-16個字元(26位元組),通過使用包含檔案大小或者時間記錄的區域獲得除了舊的8+3之外的另外15個位元組(但是出於安全和磁碟檢查工具的考慮開始叢集的區域沒有使用保留值為0)。參見8.3中另外的解釋。
長檔名條目使用下面的格式:
如果一個檔名只包含小寫字母、或者是一個小寫字母的名加上大寫副檔名的混合或者與此相反,沒有特殊的字元並且滿足8.3的限制,在Windows NT上就不建立VFAT的條目。相反,在目錄條目的偏移0x0c處的沒有說明的位用來指示檔名全部或者部分是小寫字母。特別明確的是,位4意味著小寫字母的副檔名,位3意味著名是小寫字母,這樣就允許如「example.TXT」和「HELLO.txt」這樣的組合,但是不允許「Mixed.txt」這樣的組合。很少有作業系統支援這種功能。非NT的Windows版本當這個擴充使用時將把檔名當作大寫字母。預設情況下,Linux的最近版本將認識這個擴充但是在寫時並不使用它。
在微軟公司添加長檔名和建立/訪問時間戳之前,其它的作業系統使用目錄表位元組0x0C-0x15儲存其它的元資料。它們包括:
位元組偏移 | 長度 | 系統 | 描述 | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0C | 2 | RISC OS | 檔案類型,0x000 - 0xFFF | |||||||||||||||||||||||||||||||||||||||
0x0C | 1 | DOS Plus | 使用者定義檔案屬性F1-F4
| |||||||||||||||||||||||||||||||||||||||
0x0D | 1 | DR-DOS | 被刪除檔名最初第一個字元 | |||||||||||||||||||||||||||||||||||||||
0x0E | 2 | DR-DOS和FlexOS | 加密檔案密碼 | |||||||||||||||||||||||||||||||||||||||
0x10 | 4 | DR-DOS 7 | 被刪除檔案最初的檔案時間和日期;被刪除檔案有設定到刪除時間的正常時間和日期 | |||||||||||||||||||||||||||||||||||||||
0x12 | 2 | DR-DOS 6和FlexOS | 檔案所有者身分 | |||||||||||||||||||||||||||||||||||||||
0x14 | 2 | DR-DOS和FlexOS | 檔案許可位(只有FlexOS使用執行許可):
|
FAT授權
在二十世紀九十年代中期微軟公司申請並獲得了一系列的FAT檔案系統核心部分的專利。由於具有廣泛的相容性和易於理解,FAT經常被選為用於數位相機和個人數位助理中快閃記憶體的資料交換格式。
2003年12月3日微軟公司宣布使用FAT規範和「相關智慧型產權」將需要得到 授權[永久失效連結],每個銷售單元支付0.25美元的著作權費,每個授權協定最多250,000美元的著作權費。
為了這個目的,微軟公司提及了四個關於FAT檔案系統的專利作為它的智慧財產權主張的基礎。所有這些與長檔名擴充有關的FAT首先出現在Windows 95中:
- 美國專利第5,745,902號 - 訪問使用不同檔名格式的檔名的方法和系統。1992年7月6日備案。這包括生成、聯絡一個8.3相容格式的短檔名和長檔名的方法(如「Microsoft.txt」和「MICROS~1.TXT」),以及列舉相互衝突的短檔名的方法(如「MICROS~2.TXT」和「MICROS~3.TXT」)。現在還不清楚這個專利是否覆蓋不具有顯式長檔名能力的FAT實現。Unix檔案系統中的硬連結看起來不是先行者:從長檔名刪除一個FAT檔案也將刪除它的短檔名。將一個檔案重新命名為一個「短」檔名也將一致地更改長檔名;同樣,將一個檔案重新命名為「長」檔名也將重新生成一個「短」檔名。在NTFS中,硬連結和兩個名字是不同的概念,並且每個硬連結都有兩個名字。最後,在API的層面上,當在系統中進行目錄搜尋時兩個檔名都會出現;它們看起來不是兩個獨立的檔案並且它們也沒有有必要去「對映」確定同一個檔案。
- 美國專利第5,579,517號 - 長、短檔名公用的命名空間。1995年4月24日備案。這包括將多個連續8.3目錄條目連結在一起支援長檔名的方法,其中一些條目特殊進行標記阻止可能引起混淆地早期的不支援長檔名的FAT實現。
- 公共專利基金會成功地對這項專利發起了挑戰;這個專利申請由於所申請的技術在專利美國專利第5,307,494號和美國專利第5,367,671號中的 先期發現 在2004年9月14日被 駁回 (頁面存檔備份,存於網際網路檔案館)。這個決定後來在2006年1月10日被美國專利局所推翻。
- 美國專利第5,758,352號 - 長、短檔名公用的命名空間。1996年9月5日備案。它非常類似於5,579,517。
- 公共專利基金會成功地對這項專利發起了挑戰;美國專利商標局基於 "the six assignees names were incorrect" (頁面存檔備份,存於網際網路檔案館) [4] 在2005年10月5日駁回了這項專利。這個決定也在後來的2006年1月10日被美國專利局推翻。
- 美國專利第6,286,013號 - 在作業系統中為長、短檔名提供一個公用的命名空間的方法和系統。1997年1月28日備案。它所申請的內容包括Windows 95、Windows 98和Windows Me的長檔名提供給它們MS-DOS相容層所用的方法。它看起來不影響非微軟的FAT實現。
許多技術評論斷言這些專利僅僅涵蓋了支援長檔名的FAT實現,那些只使用短名字的移動固態媒體和消費裝置將不受影響。
另外,在微軟2000年12月6日出版的"Microsoft Extensible Firmware Initiative FAT 32 File System Specification, FAT: General Overview of On-Disk Format",微軟公司明確地給出了一些授權,許多讀者將它認為是微軟允許作業系統廠商實現FAT。
由於人們廣泛要求重新審查這些專利,公眾專利基金會向美國專利及商標局(USPTO)提出了一些證據爭辯這些專利的有效性,其中包括全錄公司和IBM的早期參考資料。美國專利商標局承認這些證據提出了「可專利性的實質性的新問題」並且對於微軟公司FAT專利的有效性展開調查。
2004年9月30日,美國專利商標局主要基於公共專利基金會所提供的證據駁回了美國專利第5,579,517號的專利主張。這個基金會的執行總裁Dan Ravicher說「現在專利局只不過是確認了我們已經知道了一段時間的事情,微軟公司的專利是假的。」
PUBPAT的新聞發布會說,「微軟公司仍然有機會回應專利局的駁回。有代表性的是第三方的重新審查要求如PUBPAT提供的資料成功地減小了專利的範圍或者有70%的機會完全駁回專利。」
2005年10月5日,專利局宣布隨著調查的深入它駁回了專利5.579,517的專利主張,另外它發現專利美國專利第5,758,352號有錯誤的專利受益人而無效。
最後在2006年1月10日,專利局裁定微軟公司的FAT系統的實現特點是「新穎和非顯然的」,推翻了早期的兩個非最終裁決。
註解
參見
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.