2010-03-22 109 views
2

我試圖通過Windows碎片整理API(http://msdn.microsoft.com/en-us/library/aa363911(VS.85).aspx)對單個文件進行碎片整理,但是如果沒有足夠大的可用空間塊來存儲我的文件,我想移動文件的其他部分爲其騰出空間。如何從NTFS/FAT32中的邏輯簇號找到有關文件的信息?

鏈接的文章提到移動其他文件的部分,但我找不到有關如何找出哪些文件移動的任何信息。從可用空間位圖中,我可以找到足夠大的空間,並且我知道圍繞它的邏輯簇編號,但是由此我無法找到哪些文件圍繞它,並且需要處理文件以執行FSCTL_MOVE_FILE部分文件。

有什麼辦法通過API或通過解析MFT來找出邏輯簇編號屬於哪個文件以及文件中的虛擬簇編號與通過位圖找到的邏輯簇編號相對應嗎?

回答

1

緩慢但兼容的方法是遞歸地掃描所有目錄的文件,並使用FSCTL_GET_RETRIEVAL_POINTERS。然後掃描正在討論的集羣的最終VCN-LCN映射。

另一種辦法是,查詢USN日誌的驅動器來獲取文件參考編號,然後用FSCT_GET_NTFS_FILE_RECORD得到$ MFT文件記錄。

我目前工作的一個簡單的磁盤整理程序(Java編寫的),目的是收拾目錄(例如大型遊戲中的所有文件)的文件併攏,以減少加載時間和加載滯後。

我使用更快的方法來檢索NTFS或FAT32驅動器上的文件映射。

我解析直接$ MFT文件(格式有一定的缺陷),或FAT32文件分配表與目錄一起。

訣竅是使用FileCreate打開驅動器(例如「c:」)以完全共享GENERIC讀取。然後可以使用FileRead和FileSeek以字節粒度讀取結果句柄。這僅適用於管理員模式(或升級)。

在NTFS的MFT $可能被分割,是一個有點棘手,從引導扇區的信息找到它。我使用C:\ $ MFT文件上的FSCTL_GET_RETRIEVAL_POINTERS來獲取它的簇。

在FAT32上,必須解析啓動扇區才能找到FAT表和包含根目錄文件的集羣。您需要解析目錄條目並遞歸定位子目錄的集羣。

+3

作爲一個更新,Windows 7有'FSCTL_LOOKUP_STREAM_FROM_CLUSTER'這似乎只做一個操作的OP。 – Damon 2012-04-12 13:57:52

0

沒有O(1)從塊#映射到文件的方式。您需要遍歷整個MFT查找包含該塊的文件。

當然,在實際系統中,一旦你讀過這些數據是從過期,您必須在移動數據FSCTL失敗準備。

相關問題