要開啟fatfs的長檔名功能,必須新增oemcp與unicode的編碼轉換函式,同時也就要把oemcp與unicode的編碼轉換陣列新增進來,這是為什麼呢?
oemcp在936**頁下就是gbk,這個編碼轉換也就是gbk和unicode互轉。fatfs是使用的gbk編碼,檔案的短檔名也是gbk編碼,因此不需要轉換,可是檔案的長檔名使用的utf-16編碼,這是unicode的一種編碼方式(關於unicode和utf-16的關係,去這兒)。因此要讀取長檔名必須得先把utf-16編碼的長檔名轉換為gbk才可以。
以下如詳細內容:
fat32檔案系統在為檔案分配短檔名(sfn)目錄項的同時會為其分配長檔名(lfn)目錄項。sfn目錄項中包含了檔名的前8個字元、時間、大小、起始簇號等檔案資訊,而lfn名目錄項中只包含檔案的名字。如果乙個檔案的檔名超過了8個字元,則會為其名字截短後為其建立短檔名。將短檔名儲存在短檔名目錄項中。長檔名則存放在長檔名目錄項中。長檔名(lfn)目錄項有以下特點:
1、lfn和sfn目錄項結構在相同位置有乙個屬性標誌位元組,lfn目錄項使用乙個特定的屬性值,以說明它是乙個長檔名項。
2、項中除標誌位外的其他位元組,使用utf-16編碼,儲存13個unicode字元的檔名,每個字元占用兩個位元組。
3、如果檔名長於13個字元,則繼續為其分配lfn項,直到夠用為止。
4、所有lfn都包含乙個校驗和,通過這個校驗和將其與相應的sfn項關聯起來。
5、乙個檔案的所有lfn項按倒序排列在它的sfn項前面,即檔名的第一部分距離sfn是最近的。
一、長檔名目錄項資料結構:
詳細解釋如下:
0x00~0x00:1個位元組,長檔名目錄項的序列號,乙個檔案的第乙個長檔名序列號為1,然後依次遞增。如果是該檔案的最後乙個長檔名目錄項,則將該目錄項的序號與0x40進行「或(or)運算」的結果寫入該位置。如果該長檔名目錄項對應的檔案或子目錄被刪除,則將該位元組設定成刪除標誌0xe5。
0x01~0x0a:5個位元組,長檔名的第1~5個字元。長檔名使用unicode碼,每個字元需要兩個位元組的空間。如果檔名結束但還有未使用的位元組,則會在檔名後先填充兩個位元組的「00」,然後開始使用0xff填充。
0x0b~0x0b:1個位元組,長目錄項的屬性標誌,一定是0x0f。
0x0c~0x0c:保留。
0x0d~0x0d:1個位元組,校驗和。如果乙個檔案的長檔名需要幾個長檔名目錄項進行儲存,則這些長檔名目錄項具有相同的校驗和。
0x0e~0x19:12個位元組,檔名的第6~11個字元,未使用的位元組用0xff填充。
0x1a~0x1b:2個位元組,保留。
0x1c~0x1f:4個位元組,檔名的第12~13個字元,未使用的位元組用0xff填充。
二、長檔名目錄項例項分析
首先我們在根目錄下建立乙個名字為「a***foryatoumadebyfgd20090808summer.txt」的檔案,然後用winhex來看看它的長檔名目錄項,如下圖:
上面看的第二幅圖就是由「a***foryatoumadebyfgd20090808summer.txt」檔案的短檔名目錄項和長檔名目錄項組成。最下面的乙個目錄項就是該檔案的短檔名目錄項,我們可以看到,「a***foryatoumadebyfgd20090808summer.txt」檔名被截斷,取出前六個字元「a***fo」(注意短檔名是不分大小寫的),然後加上「~1」,最後加上它的副檔名。由短檔名向上,是它的長檔名目錄項。「a***foryatoumadebyfgd20090808summer.txt」共有39個字元,每個長檔名目錄項可以記錄13個字元,因此需要3個長檔名目錄項。短檔名目錄項向上第乙個小方框卷定的目錄項是它的第乙個長檔名目錄項,向上依次為2、3號,從每個長檔名目錄項的第乙個位元組可以看出他們的序號。
我們先來看第乙個內容:
0x0b位元組處的「0f」表示這是乙個長檔名目錄項。
0x00位元組處的「01」表示這是該檔案的第乙個長檔名目錄項。
0x01~0x0a位元組處的10個位元組為檔名的第1~5個字元「a***f」。0x0e~0x19子接觸的12個位元組是檔名的第6~11個字元「oryato」,0x1c~0x1f處的4個位元組是檔名的第12~13個字元「um」。
第二個長檔名目錄項的第乙個位元組「02」表示這是該檔案的第二個長檔名目錄項,各部分位元組含義由讀者自行分析。
第三個長檔名目錄項的第乙個位元組為「43」,是0x40和0x03進行或運算的結果。說明這是該檔案的第3個長檔名目錄項,也是最後乙個。
我們分別看3個長檔名目錄項0x0d位元組處的值——0x8b,這是長檔名目錄項的校驗和。說明這3個目錄項同屬乙個長檔名目錄項。
fatfs檔案系統支援中文長檔名
一 引出 fatfs檔案系統中存在短檔名和長檔名的概念。當檔名的字元長度短於13個字元時,稱為短檔名。當長於13個字元則稱為長檔名。如果不配置fatfs檔案系統的長檔名功能,當遇到短於13個字元檔名的檔案時可以正常顯示,ke是當遇到檔名比13字元長時,fatfs就會自動做截斷處理,效果如下 當配置了...
Windows刪除長檔名檔案
windows server 2003存在長檔名檔案問題,例如用ftp上傳了乙個檔名超過1024位元組長度的檔案,然後無法刪除。參考以下步驟 1.查詢要刪的檔案,獲取短檔名 d checkpointbeforemove dir x f1fj03 驅動器 d 中的卷是 新加捲 卷的序列號是 8869 ...
C VC 如何開啟長檔名的檔案
c vc 如何開啟長檔名的檔案 概述 最近本人在操作檔案的時候,碰到了長檔名,即絕對路徑 檔名總長度大於等於260位元組,這些長檔名直接使用fopen會失敗的。本文舉例描述了,怎麼樣成功首席執行官檔名fopen,從而順利讀寫 建立等檔案操作,滿足了大部分檔案操作的需要。編譯環境 vs2010 讀操作...