檔案配置表(英語: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, StackerDoubleSpaceDriveSpace
透明加密 Per-volume only with DR-DOS

FAT文件系統考慮當時電腦效能有限,所以未被複雜化,因此幾乎所有個人電腦作業系統都支持。這特性使它成為理想的軟碟記憶卡檔案系統,也適合用作不同操作系統中的資料交流。

但FAT有一個嚴重的缺點:當文件刪除後寫入新資料,FAT不會將檔案整理成完整片段再寫入,長期使用後會使檔案資料變得逐漸分散,而減慢了讀寫速度。磁碟重組是一種解決方法,但必須經常磁碟重組來保持FAT文件系統的效率。

歷史 編輯

FAT文件系統遵行已用了多年的軟體方法來進行規範。它在1977年由比爾·蓋茨馬斯·麥當勞為了管理磁碟而發明,並在1980年被添·彼得遜86-DOS作業系統採用。這也是86-DOS作業系統與CP/M作業系統最大的不同點,若非此項差異,86-DOS作業系統與CP/M作業系統幾乎可說完全相同。[3]

FAT12 編輯

初期的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。

FAT16的開始 編輯

在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標準尚未出現)能夠將大硬盤顯示為兩個獨立的硬盤。

最終的FAT16 編輯

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也支持這種格式的讀寫操作,但是它的磁盤管理工具不支持這種格式。

長文件名(VFAT, LFN) 編輯

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等命令顯示出長文件名。

FAT32 編輯

為了解決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 2000Windows XP能夠讀寫任何大小的FAT32文件系統,但是這些平台上的格式化程序只能創建最大32GB的FAT32文件系統。Thompson and Thompson(2003)寫道「奇怪的是微軟公司說這種現象是故意設計的」[4] 微軟公司知識庫文章184006[5]的確是這麼說的,但是沒有提出任何關於這個限制的合理解釋。Peter Norton的觀點是「微軟公司在有意地削弱FAT32文件系統」[6]

exFAT 編輯

Windows Embedded CE 6.0中引入,Windows XP SP3 以及 Windows Vista SP1也引入了exFAT的支持。在很多方面exFAT有了相當大的改進,特別適合用於快閃記憶體

第三方支持 編輯

其它IBM PC的可選操作系統,如LinuxFreeBSDBeOS都支持FAT格式,並且大部分都在相應的Windows版本發布以後很快就支持VFAT和FAT32格式。早期的Linux發布版本還包括稱為UMSDOS的格式,它是保存在一個獨立的稱為--linux-.——的帶有Unix文件屬性(如長文件名和訪問許可)的FAT。UMSDOS在VFAT發布以後就不再使用。Linux內核從2.5.7開始就禁止了這項功能。Mac OS X操作系統在除啟動盤之外的其它卷上也支持FAT文件系統。

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文件系統包括四個不同的部分。

  1. 保留扇區,位於最開始的位置。 第一個保留扇區是引導扇區分區啟動記錄)。它包括一個稱為基本輸入輸出參數塊的區域(包括一些基本的文件系統信息尤其是它的類型和其它指向其它扇區的指針),通常包括操作系統的啟動調用代碼。保留扇區的總數記錄在引導扇區中的一個參數中。引導扇區中的重要信息可以被DOS和OS/2中稱為驅動器參數塊的操作系統結構訪問。
  2. FAT區域。它包含有兩份文件分配表,這是出於系統冗餘考慮,儘管它很少使用,即使是磁盤修復工具也很少使用它。它是分區信息的映射表,指示簇是如何存儲的。
  3. 根目錄區域。它是在根目錄中存儲文件和目錄信息的目錄表。在FAT32下它可以存在分區中的任何位置,但是在早期的版本中它永遠緊隨FAT區域之後。
  4. 數據區域。這是實際的文件和目錄數據存儲的區域,它占據了分區的絕大部分。通過簡單地在FAT中添加文件鏈接的個數可以任意增加文件大小和子目錄個數(只要有空簇存在)。然而需要注意的是每個簇只能被一個文件占有,這樣的話如果在32KB大小的簇中有一個1KB大小的文件,那麼31KB的空間就浪費掉了。

啟動扇區 編輯

格式如下

偏移(字節) 長度(字節) 說明
0x00 3 跳轉指令(跳過開頭一段區域)
0x03 8 OEM名稱(空格補齊)。MS-DOS檢查這個區域以確定使用啟動記錄中的哪一部分數據 [1]頁面存檔備份,存於網際網路檔案館) 。常見值是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 介質描述
0xF8 單面、每面80磁道、每磁道9扇區
0xF9 雙面、每面80磁道、每磁道9扇區
0xFA 單面、每面80磁道、每磁道8扇區
0xFB 雙面、每面80磁道、每磁道8扇區
0xFC 單面、每面40磁道、每磁道9扇區
0xFD 雙面、每面40磁道、每磁道9扇區
0xFE 單面、每面40磁道、每磁道8扇區
0xFF 雙面、每面40磁道、每磁道8扇區

同樣的介質描述必須在重複複製到每份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 PCMS-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文件名(附加空格)

第一個字節可以是下面的特殊數值:

0x00 這個條目有用並且後面沒有被占用條目
0x05 最初字符確實是0xE5
0x2E '點'條目;'.'或者'..'
0xE5 這個條目曾經被刪除不再有用。取消刪除文件工具作為取消刪除的一步必須使用一個正常的字符取代它。
0x08 3 DOS文件擴展名(空格補齊)
0x0b 1 文件屬性

第一個字節可以是下面一些特殊值:

掩碼 描述
0 0x01 只讀
1 0x02 隱藏
2 0x04 系統
3 0x08 卷標
4 0x10 子目錄
5 0x20 檔案
6 0x40 設備(內部使用,磁盤上看不到)
7 0x80 沒有使用

屬性值0x0F用來表示長文件名條目。

0x0c 1 保留,NT使用(參見後面)
0x0d 1 創建時間,最小時間分辨率:10ms單位,數值從0到199。
0x0e 2 創建時間。小時、分鐘和秒根據後面的圖示描述進行編碼:
描述
15-11 小時(0-23)
10-5 分鐘(0-59)
4-0 秒/2(0-29)

注意只保存了2秒的分辨率。更細分辨率的文件創建時間在偏移0x0d處。

0x10 2 創建日期。年、月和日根據後面的圖示編碼:
描述
15-9 年(0 = 1980, 127 = 2107)
8-5 月(1 = 1月,12 = 12月)
4-0 日(1 - 31)
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中另外的解釋。

長文件名條目使用下面的格式:

字節偏移 長度 描述
0x00 1 序列號
0x01 10 名稱字符(5個UTF-16字符)
0x0b 1 屬性(永遠是0x0F)
0x0c 1 保留(永遠是0x00)
0x0d 1 DOS文件名校驗和
0x0e 12 名稱字符(6個UTF-16字符)
0x1a 2 第一個簇(永遠是0x0000)
0x1c 4 名稱字符(兩個UTF-16字符)

如果一個文件名只包含小寫字母、或者是一個小寫字母的加上大寫擴展名的混合或者與此相反,沒有特殊的字符並且滿足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
掩碼 描述
7 0x80 F1
6 0x40 F2
5 0x20 F3
4 0x10 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使用執行許可):
掩碼 描述
0 0x0001 所有者刪除需要密碼
1 0x0002 所有者執行需要密碼
2 0x0004 所有者寫需要密碼
3 0x0008 所有者讀需要密碼
4 0x0010 組刪除需要密碼
5 0x0020 組執行需要密碼
6 0x0040 組寫需要密碼
7 0x0080 組讀需要密碼
8 0x0100 全部用戶刪除需要密碼
9 0x0200 全部用戶執行需要密碼
10 0x0400 全部用戶寫需要密碼
11 0x0800 全部用戶讀需要密碼

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的層面上,當在系統中進行目錄搜索時兩個文件名都會出現;它們看起來不是兩個獨立的文件並且它們也沒有有必要去「映射」確定同一個文件。

許多技術評論斷言這些專利僅僅涵蓋了支持長文件名的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系統的實現特點是「新穎和非顯然的」,推翻了早期的兩個非最終裁決。

註解 編輯

  1. ^ Archive(A)位元:檔案建立或更改後會被設成1,經作業系統內的backup做檔案備份後會被設成0。如只需備份上次備份後有修改的檔案,可藉此位元識別。
  2. ^ 專利申請在於文件系統中支持長文件名的技術,而不是文件系統核心本身。
  3. ^ Duncan, Ray(1989).Design goals and implementation of the new High Performance File System頁面存檔備份,存於網際網路檔案館). Microsoft Systems Journal 4(5).
  4. ^ Thompson, Robert Bruce and Barbara Fritchman Thompson, PC Hardware in a Nutshell, 3rd Edition,, O'Reilly, ISBN 0-596-00513-X(p. 506 re Microsoft "bizarrely" saying 32 GB limitation is by design
  5. ^ 引用錯誤:沒有為名為ms-sp-184006的參考文獻提供內容
  6. ^ Norton, Peter(2002頁面文件)

參見 編輯

外部連結 編輯