FAT
維基百科,自由的百科全書
- zh-cn:文件分配表;zh-tw:檔案配置表 當前用字模式下顯示為→檔案配置表
- zh-cn:鏈表;zh-tw:連結串列表 當前用字模式下顯示為→連結串列表
- zh-cn:文件;zh-tw:檔案 當前用字模式下顯示為→檔案
- zh-tw:作業系統;zh-cn:操作系統 當前用字模式下顯示為→作業系統
用詞轉換(繁簡轉換)是中文維基的一項自動轉換,目的是以電腦程式適應不同用字模式的差異。標題轉換和全文轉換都是對該技術的手動轉換的應用。
由於技術所限,用詞轉換有時會不穩定,在剛增加標題轉換和全文轉換時,由於緩存原因不一定馬上顯示轉換後的正確結果。你可以嘗試單擊這裡進行強制刷新。
FAT12 | FAT16 | FAT32 | |
微軟 | |||
檔案配置表 | |||
(12位元版本) | (16位元版本) | (32位元版本) | |
1977年 (微軟Disk BASIC) | 1988年七月 (MS-DOS 4.0) | 1996年八月 (Windows 95 OSR2) | |
0x01 (MBR) | 0x04, 0x06, 0x0E (MBR) | 0x0B, 0x0C (MBR) EBD0A0A2-B9E5-4433 -87C0-68B6B72699C7 (GPT) | |
Table | |||
連結串列表 | |||
連結串列表 | |||
32 MiB | 2 GiB | 4 GiB | |
4,077 | 65,517 | 268,435,437 | |
8.3 或者 長檔案名255個字元 | |||
32 MiB | 4 GiB | 8 TiB | |
創建、修改、訪問 | |||
1980年1月1日至2107年12月31日 | |||
非原生 | |||
唯讀, 隱藏, 系統, 卷標, 子目錄, 檔案 | |||
No | |||
Per-volume, Stacker, DoubleSpace, DriveSpace | No | ||
Per-volume only with DR-DOS | No |
檔案配置表(File Allocation Table),是一種由微軟發明的並帶有部分專利[1]的檔案系統,供MS-DOS使用,也是非NT核心的微軟視窗使用的檔案系統。
FAT檔案系統考慮當時電腦效能有限,所以未被複雜化,因而被幾乎所有個人電腦的作業系統支持。這特性使它成為理想的軟碟和記憶卡檔案系統,也適合用作不同作業系統中的資料交流。
但FAT有一個嚴重的缺點:當檔案被刪除並且在同一位置被寫入新資料,他們的片段通常是分散的,減慢了讀寫速度。磁碟碎片重整是一種解決方法,但必須經常重組來保持FAT檔案系統的效率。
[編輯] 歷史
FAT檔案系統遵行已用了多年的軟體方法來進行規範。它在1977年由比爾·蓋茨和馬斯·麥當勞為了管理磁碟而發明,並在1980年被添·彼得遜的86-DOS作業系統採用。這也是86-DOS作業系統與CP/M作業系統最大的不同點,若非此項差異,86-DOS作業系統與CP/M作業系統幾乎可說完全相同。[2]
[編輯] FAT12
初期的FAT就是現在俗稱的FAT12。作為軟碟的檔案系統,它有幾項限制:不支持分層性結構,叢集定址只有12位元(這使得控制FAT有些棘手)而且只支援最多32M(216)的分區。
當時入門級的磁碟是5.25"、單面、40磁軌、每個磁軌8個扇區、容量略少於160KB。上面的限制超過了這個容量一個或幾個數量級,同時允許將所有的控制結構放在第一個磁軌,這樣在讀寫操作時移動磁頭。這些限制在隨後的幾年時間里被逐步增大。
由於唯一的根目錄也必須放在第一個磁軌,能夠存放的檔案個數就限制在了幾十個。
[編輯] 目錄
為了很好地支持以帶有10MB硬碟為特色的IBM PC XT新電腦,在1983年年初MS-DOS 2.0幾乎電腦在同時發佈,它引進了層次目錄結構。除了允許更好地組織檔案外,目錄允許在硬碟上存儲更多的檔案,這是因為最大檔案個數不再受制於(仍然是固定的)根目錄大小。這個數目現在能夠等同於簇的數目(甚至更大,這是考慮到長度為0的檔案並不佔據任何FAT簇)。
FAT本身的格式並沒有改變。PC XT的10MB的硬碟有4KB大小的簇。如果後來安裝了一個20MB的硬碟,並且使用MS-DOS 2.0格式化,最後的簇大小將變為8KB,硬碟容量將變為15.9MB。
[編輯] FAT16的開始
在1984年,IBM發布PC AT,這是一個20 MB的硬碟。微軟公司也同步發佈了MS-DOS 3.0。簇集位址增加至16位元,允許更大數量的叢集(最大 65,517),所以有更大的檔案系統大小。但是,最大數量磁區及最大分割區(相當於磁盤)的大小仍是32 MB。所以,儘管技術上已經是「FAT16」,這種格式並不是我們今天常見到的這個名字所代表的格式。在MS-DOS 3.0格式化一個20 MB的硬碟,這硬碟將不能被MS-DOS 2.0或之前的版本所存取。當然,MS-DOS 3.0 仍然可存取MS-DOS 2.0的格式(8 KB叢集的分割區)。
MS-DOS 3.0也開始支持高密度1.2MB 5.25"磁碟,最著名的是每個磁軌有15個扇區,這樣就允許FAT有更大的空間。這或許促進了一個對於叢集大小的不確定的優化,叢集大小從2個扇區減到1個。這樣做的最後結果是高密度磁碟比舊的雙密度磁碟的速度大幅度降低。
[編輯] 擴展分區和邏輯驅動器
除了改進FAT檔案系統本身的結構之外,一個並行的提高FAT存儲空間的開發路線是支持多個磁碟分區。最初,由於主引導分區中檔案配置表的固定結構的原因一個硬碟只能使用多達4個分區。然而,由於DOS設計要求只能有一個分區標識為「活動的」,它也是主引導代碼啟動所用的分區。使用DOS工具不可能創建幾個「主」DOS分區,並且第三方的工具也至少會警告這樣一個機制將與DOS不相容。
為了用一種相容的方式使用更多的分區,一種新的分區類型被開發出來(1986年]1月的MS-DOS 3.2),擴展分區它實際上是另外稱為邏輯分區的一個容器。最初它裡面只允許有一個邏輯分區、支持最大64MB的硬碟。在MS-DOS 3.3(1987年8月)這個限制更改到24個分區;它可能來自於強制性的C:-Z:的磁碟命名規則。邏輯分區表使用盤上的資料結構來描述,可能是為了簡化編碼它與主引導記錄非常相似,並且它們組織成類似於俄羅斯套娃那樣的結構。系統中只能有一個擴展分區。
在擴展分區引入之前,一些硬碟控制器(當時是獨立的板子,因為還沒有IDE標準)能夠將大硬碟顯示為兩個獨立的硬碟。作為一種選擇,如Ontrack[1]的磁碟管理員這樣的一些特殊軟體可以用於同樣目的。
[編輯] 最終的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的扇區,這樣大小限制也就成比例地增大。
後來,視窗NT通過將每個叢集的扇區數當作無符號數將最大的叢集大小增加到64KB。然而這個格式與當時其它的任何FAT實現都不相容並且產生了大量內部碎片。視窗98也支持這種格式的讀寫操作但是它的磁碟管理工具不支持這種格式。
[編輯] 長檔案名(VFAT, LFN)
Windows 95設計人員的一個用戶體驗目標就是除了傳統的8.3檔案名以外在新作業系統中使用長檔案名(LFN)。長檔案名通過在目錄條目排列時使用一個工作區來實現(參見下面)。按照Windows 95VxD設備驅動程序的命名規則這個新擴充的檔案系統通常稱為VFAT。
有意思的是,VFAT驅動在早於Windows 95的Windows for Groups 3.11中就已經出現,但它僅僅用於實現32位檔案訪問,一個繞過DOS的視窗自帶高性能保護模式檔案管理系統,它能夠直接使用BIOS或者更好的32位磁碟訪問,如視窗自帶的保護模式磁碟驅動程序。它是一個後門;微軟為Windows for Groups 3.11所作的廣告說32位檔案訪問基於「芝加哥項目的32位檔案系統」。
在Windows NT中,FAT檔案系統對於長檔案名的支持從3.5版就已經開始了。
[編輯] FAT32
為了解決FAT16對於卷大小的限制同時讓DOS的真實模式在非必要情況下不減少可用常規記憶體狀況下處理這種格式,微軟公司決定實施新一代的FAT,它被稱為FAT32,帶有32位的叢集數,目前用了其中的28位。
理論上,這將支持總數達268,435,438(<228)的叢集,允許磁碟容量達到2位元組。然而,由於微軟公司scandisk工具的限制,FAT不能大於4,177,920(<222)個叢集,這將卷的容量限制在了124.55GB,除非不再使用「scandisk」。[2]
FAT32隨著視窗95 OSR2發佈,儘管需要重新格式化才能使用這種格式並且DriverSpace 3(視窗95 OSR2和視窗98所帶版本)從來都不支援這種格式。視窗98提供了一個工具用來在不丟失數據的情況下將現有的硬碟從FAT16轉到FAT32格式。在NT產品線上對於它的支援從視窗2000開始。
視窗2000和視窗XP能夠讀寫任何大小的FAT32檔案系統,但是這些平臺上的格式化程序只能創建最大32GB的FAT32檔案系統。Thompson and Thompson (2003)寫道「奇怪的是微軟公司說這種現象是故意設計的」[3] 微軟公司知識庫文章 184006[4]的確是這麼說的,但是沒有提出任何關於這個限制的合理解釋。Peter Norton的觀點是「微軟公司在有意地削弱FAT32檔案系統」[5]。
[編輯] 第三方支持
其它IBM PC的可選作業系統—如Linux、FreeBSD和BeOS—都支持FAT格式,並且大部分都在相應的視窗版本發佈以後很快就支持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和視窗NT)。第二種設計,儘管想象起來會更有效率,但是它們不能被不認識這種格式的工具複製或者備份;使用不能識別這種格式的磁碟工具(如碎片整理或CHKFSK)控制這些磁碟可能會破壞這些信息。
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腳本、許多系統圖形用戶介面和命令行工具(如4DOS|4OS2]]來訪問。
Windows NT支持HPFS、NTFS和FAT中所有擴展屬性的處理(所用處理機制完全類似於OS/2),但是不能處理其它一些存於NTFS驅動器的ADS數據。試圖從複製帶有與NTFS驅動器屬性不同擴展屬性的ADS到FAT驅動器將報告一個警告信息提示ADS將會丟失。
Windows 2000以後產品的處理類似於視窗NT但複製到FAT32時它們沒有顯示任何警告信息直接丟棄擴展屬性(但報告其它象「Macintosh Finder Info」和「Macintosh Resource Fork」這些ADS引起的警告)。
[編輯] 前景
微軟公司最近獲得了VFAT和FAT32的專利(但沒有得到最初的FAT的專利),這引起人們對於微軟將會尋求從Linux OS發佈和初始化他們產品的媒體廠商收取專利費的擔憂(參見下面的FAT授權協議)。儘管最初的裁定不利於微軟公司,但是微軟仍然取得了勝利並且得到了專利授權。
由於微軟公司已經宣佈不再開發基於MS-DOS的消費用作業系統視窗Me的後續版本,所以不再有可能會有新版的FAT。對於大多數用途來說,為視窗NT系列開發的NTFS檔案系統從效率、性能和可靠性來說都優於FAT;它的主要缺點是小容量檔案所占的額太空間以及除了基於NT的視窗之外的很少有其他作業系統支援。由於確切的規範是微軟公司的商業秘密,這就使得使用一個DOS軟盤用於恢復目的很困難。微軟公司提供了一個恢復界面來解決這個問題,由於安全的原因它嚴重限制了預設情況下它能解決的問題。
FAT仍然是活動媒體的常用檔案系統(CD和DVD是例外),軟碟使用的是FAT12,其它多數活動媒體用的是FAT16(如用於數位相機的快閃記憶卡和USB隨身碟)。許多活動媒體還沒有達到能夠享用FAT32。出於相容性和存儲空間利用率的考慮FAT仍然用在這些驅動器上,同時也是由於這些活動媒體上的檔案的許可更容易遇到麻煩而不是更重要這樣一個事實。
視窗2000和XP支援的FAT32格式化的限制是32GB,這非常有效地強迫使用現代硬碟的用戶或者使用NTFS或者在視窗之外格式化驅動器。一個解決的辦法是使用從Linux移植到視窗平臺的一個工具version of mkdosfs。
這裡也有一個自由開源的工具。
[編輯] 設計
[編輯] 主磁碟結構
主啟動區 | 檔案 分配表 #1 | 檔案 分配表 #2 | 根目錄 | 其他所有資料... 剩下磁碟空間 |
一個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) | ||||||||||||||||
0x2b | 11 | 卷標 | ||||||||||||||||
0x36 | 8 | FAT檔案系統類型(如FAT、FAT12、FAT16、FAT32) | ||||||||||||||||
0x3e | 448 | 作業系統自引導代碼 | ||||||||||||||||
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)是映射到分區每個叢集的條目列表。每個條目記錄下面五種信息中的一種。
- 鏈中下一個叢集的地址
- 一個特殊的檔案結束符(EOF)符號指示鏈的結束
- 一個特殊的符號標示壞叢集
- 一個特殊的符號標示保留叢集
- 0來表示空閒叢集
每個版本的FAT檔案系統使用不同大小的FAT條目。這個大小已經由名字表示出來,例如FAT16檔案系統的每個條目使用16位表示,32位檔案系統使用32位表示。這個不同意味著FAT32系統的檔案配置表能比FAT16映射更多的叢集,它也允許FAT32有更大的分區大小。這也使得FAT32比FAT16更能有效地利用磁碟空間,因為每個驅動器能夠定址更小的叢集,這也就意味著更少的空間浪費。
FAT條目值:
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 | 最近訪問時間;參見偏移 0x0e 處的描述。 | ||||||||||||||||||||||||
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的限制,在視窗NT上就不創建VFAT的條目。相反,在目錄條目的偏移0x0c處的沒有說明的位用來指示檔案名全部或者部分是小寫字母。特別明確的是,位4意味著小寫字母的擴展名,位3意味著名是小寫字母,這樣就允許如「example.TXT」和「HELLO.txt」這樣的組合,但是不允許「Mixed.txt」這樣的組合。很少有作業系統支持這種功能。非NT視窗版本當這個擴展使用時將把檔案名當作大寫字母。預設情況下,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使用執行許可):
|
留言列表