文件命名時有一個8.3規則
8是指文件名,就是******.XXX裏的***
意思是這個部分不能超過8個字符,在DOS裏,若是超過8個字符了是不會被識別的.後面的XXX是擴展名,也不必定非得是三個字符,像網頁文件的擴展名能夠是htm也能夠是html,只不過國際上習慣於用三個字符來作擴展名
「文件名.擴展名」纔是一個文件的完整的名字
文件名用來標識一個單獨的文件,指的是一個個體,擴展名標識的是一類文件html
2011-07-29 16:22:11| 分類: 實時操做系統 |舉報 |字號 訂閱 算法
FAT32的一個重要的特色是徹底支持長文件名。長文件名依然是記錄在目錄項中的。編碼
爲了低版本的OS或程序能正確讀取長文件名文件,系統自動爲全部長文件名文件建立了一個對應的短文件名,使對應數據既能夠用長文件名尋址,也能夠用短文件名尋址。不支持長文件名的OS或程序會忽略它認爲不合法的長文件名字段,而支持長文件名的OS或程序則會以長文件名爲顯式項來記錄和編輯,並隱藏起短文件名。spa
當建立一個長文件名文件時,系統會自動加上對應的短文件名,其通常有的原則:
(1)、取長文件名的前6個字符加上"~1"造成短文件名,擴展名不變。
(2)、若是已存在這個文件名,則符號"~"後的數字遞增,直到5。
(3)、若是文件名中"~"後面的數字達到5,則短文件名只使用長文件名的前兩個字母。經過數學操縱長文件名的剩餘字母生成短文件名的後四個字母,而後加後綴"~1"直到最後(若是有必要,或是其餘數字以免重複的文件名)。
(4)、若是存在老OS或程序沒法讀取的字符,換以"_"操作系統
短文件格式的目錄項。其參數意義見表14:
code
表14 FAT32短文件目錄項32個字節的表示定義 | |||
字節偏移(16進制) | 字節數 | 定義 | |
0x0~0x7 | 8 | 文件名 | |
0x8~0xA | 3 | 擴展名 | |
0xB* | 1 | 屬性字節 | 00000000(讀寫) |
00000001(只讀) | |||
00000010(隱藏) | |||
00000100(系統) | |||
00001000(卷標) | |||
00010000(子目錄) | |||
00100000(歸檔) | |||
0xC | 1 | 系統保留 | |
0xD | 1 | 建立時間的10毫秒位 | |
0xE~0xF | 2 | 文件建立時間 | |
0x10~0x11 | 2 | 文件建立日期 | |
0x12~0x13 | 2 | 文件最後訪問日期 | |
0x14~0x15 | 2 | 文件起始簇號的高16位 | |
0x16~0x17 | 2 | 文件的最近修改時間 | |
0x18~0x19 | 2 | 文件的最近修改日期 | |
0x1A~0x1B | 2 | 文件起始簇號的低16位 | |
0x1C~0x1F | 4 | 表示文件的長度 |
* 此字段在短文件目錄項中不可取值0FH,若是設值爲0FH,目錄段爲長文件名目錄段htm |
長文件名的實現有賴於目錄項偏移爲0xB的屬性字節,當此字節的屬性爲:只讀、隱藏、系統、卷標,即其值爲0FH時,DOS和WIN32會認爲其不合法而忽略其存在。這正是長文件名存在的依據。blog
將目錄項的0xB置爲0F,其餘就職由系統定義了,Windows9x或Windows 2000、XP一般支持不超過255個字符的長文件名。unicode
系統將長文件名以13個字符爲單位進行切割,每一組佔據一個目錄項。因此可能一個文件須要多個目錄項,這時長文件名的各個目錄項按倒序排列在目錄表中,以防與其餘文件名混淆。
長文件名中的字符采用unicode形式編碼(一個巨大的進步哦),每一個字符佔據2字節的空間。其目錄項定義如表15。字符串
系統在存儲長文件名時,老是先按倒序填充長文件名目錄項,而後緊跟其對應的短文件名。從 表15能夠看出,長文件名中並不存儲對應文件的文件開始簇、文件大小、各類時間和日期屬性。文件的這些屬性仍是存放在短文件名目錄項中,一個長文件名老是 和其相應的短文件名一一對應,短文件名沒有了長文件名還能夠讀,但長文件名若是沒有對應的短文件名,無論什麼系統都將忽略其存在。因此短文件名是相當重要 的。
在不支持長文件名的環境中對短文件名中的文件名和擴展名字段做更改(包括刪除,由於刪除是對首字符改寫E5H),都會使長文件名形同虛設。
(長文件名如何與短文件名對應?僅靠她們之間的位置關係?)
長文件名和短文件名之間的聯繫光靠他們之間的位置關係維繫顯然遠遠不夠。其實,長文件名的0xD字節的校驗和起很重要的做用,此校驗和是用短文件名的11 個字符經過一種運算方式來獲得的。系統根據相應的算法來肯定相應的長文件名和短文件名是否匹配。這個算法不太容易用公式說明,咱們用一段c程序來加以說 明。
假設文件名11個字符組成字符串shortname[],校驗和用chknum表示。獲得過程以下:
int i,j,chknum=0;
for (i=11; i>0; i--)
chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];
若是經過短文件名計算出來的校驗和與長文件名中的0xD偏移處數據不相等。系統不管如何都不會將它們配對的。 依據長文件名和短文件名對目錄項的定義,加上對簇的編號和連接,FAT32上數據的讀取便遊刃有餘了。