absmiddle 批判 VFAT 長檔名


[解說] foolman.bbs@bach.mc.ntu (回家前灌到 800 篇!): VFAT 如果嚴格來說, 只能說他是 FAT 的延伸, 如果說它會有什麼主要的改進的話, 值得一提的也只有三點, 分別是長檔名, 32bit access, 和改成 Installable... 不過 VFAT 它使用長檔名的方式是利用 Multi-entry 的方式, 也就是同一個檔案擁有 多個的 Entries, 其中一個 Entry 被保留成 8.3 的格式, 而多出來的 Entries 則依 照 Allocated 的順序, 反向以 Unicode 組成長檔名. 這是 VFAT 支援 LFN 的方式, 但是一般具有存取 FAT 的 OS, 其系統辨認 FAT 檔名 的呼叫幾乎都一樣, 只能辨認 Read-only, Hidden, System, Directory, Volume bits, 如果一個 Entry 同時在 RHSDV 等 bits 皆為 1, 因為這是個 Impossible Case, 所以這些 FAT 檔名呼叫皆會忽略此種 Entry, 也就是說, 在 FAT 中, 如果存 在這種情形的話, OS 既不會取得此種資訊, 亦不會顯示錯誤訊息. 而微軟就很巧妙地利用此種特性, 在寫入檔名資訊時候, 同時寫入兩種 Entries, 一個是 FAT 的 Entry (正常的情形, RHS, D, V 互斥), 一個是 VFAT 的 Entries (RHSDV 同時為 Active bit) 如果功力強到能寫一個 for OS/2 的 VFAT.IFS, 也可以很輕鬆地讓 OS/2 支援 VFAT, 反正 OS/2 的 File System 也是可 Installable, 所以只要知道 OS/2 的 .IFS 格式 寫法, 這倒蠻簡單的. [版主] Linux 也是, 已支援 VFAT. 根據前一篇對 VFAT LFN 的描述, 一般的程式也可以實作出 '讀取及寫入' 的 Function, 只要知道檔案描述區在硬碟上那一個位置 (因為檔案內容和檔案的描述資 訊除了必要的位置和長度有關聯外, 一些檔名. 性質等等, 並沒有多大的關聯性), 因 此我們可以利用磁碟絕對存取來讀出資訊, 接著加以組合和變換, 便可制作出在非 95 之下存取 LFN 的方法. 這個作法不論在那一個作業平台都是具體可行的, 只不過差別 在存取 LFN 的呼叫是程式自己提供, 不是 OS 提供. 又, 如果沒記錯的話, DOS 7.00 (就是 95 附的那一個 16bit real mode precursor) 他的 int21h 就有一個 LFN 呼叫, 可在 16bit 下實作 LFN. [解說] jackei@Maxwell (逸容): 就我所知 VFAT 長檔名的缺陷. 1.根目錄的數目本來就受限於 FAT, 不得超過 512 個. 若使用長檔名的目錄數目會更少. 不過... 哪個人可以告訴我, 碰過這種問題的? 2."不" 在 Win95 下殺 "長檔名", 除了開頭的 16-bit, 其它的 (前面說過它是連結 多個), 其它的短檔名記錄空間不會清除釋回, 造成檔案記錄空間浪費. 舉例而言, 在 95 下根目錄本來有 100 長檔名個檔案目錄, 但實際上用到 500 個 Entry(目錄清冊), 那麼 "在 95" 下還能建立一個 143 字元的檔案目錄(一個 Entry 記錄短檔名, 另外 11 個最多能存放 11x13=143 個字元), 或是 6 個 8.3 檔名目錄 (每個各用一個 Entry 記錄短檔名, 一個記錄長檔名.) 或是其它許許多多的組合... 但在 "純 DOS" 下, 它能知道還剩下 12 個 Entry(但不會知道其它 500 個怎麼用掉 的, 因為 "看不懂長檔名的 Entry", 所以也只能認出 100 個 8.3 檔案目錄.) 而還 能建立 12 個 8.3 檔名目錄. 現在問題來了, 一進入 95 後 (以下都是我的猜測, 知道 "真相" 者還請不吝糾正:) 開啟檔案總管"看"那些"純 DOS"下建的檔名目錄可能就有問題了. 前面說過, 不知道 95 哪時候建立 LFN 目錄清冊. 如果是讀取清冊時"順便"把沒有 LFN 的(在其它 OS 建立的檔名目錄)補建上去, 那...根本沒 Entry 可用了不知會如何. 就算不是現在 ,也會在將來的某天 95 建立 LFN 時出問題 (更改檔名, 搬移...等等) 另外, Scandisk 會偵測出孤立的 (見前面所提第二點缺陷) Entry 並詢問是否清除. 還有, LFN 若造成 Entry 散亂 (可以看成是 Disk 的 Fragmentation), 過長的檔名 可能無法新增 (如同 Disk 找不到夠大的連續存放空間, 一個 LFN 的存放必需是連 續的). 解決的方法... Defrag^_^ Scandisk & Defrag 在 VFAT 下似乎顯得重要了.
上一層目錄