2011-12-30 83 views
1

我的問題是:如果此文件(非常重要)很小(少於一個羣集,只有幾個字節),如何獲得文件磁盤偏移量。FSCTL_GET_RETRIEVAL_POINTERS NT文件系統上很小文件上的故障

目前我使用這個Windows API函數:

DeviceIOControl(FileHandle, FSCTL_GET_RETRIEVAL_POINTERS, @InBuffer, SizeOf(InBuffer), @OutBuffer, SizeOf(OutBuffer), Num, Nil); 
FirsExtent.Start := OutBuffer.Pair[0].LogicalCluster ; 

它的工作原理完美比集羣更大的文件,但它只是失敗,較小的文件,因爲它總是返回一個空抵消。

小文件的步驟是什麼?它們位於NTFS捲上的位置?是否有另一種方法來了解文件偏移量?這種凌辱似乎沒有任何記錄。

注意:該問題被標記爲Delphi,但C++示例或示例也將被讚賞。

+0

* * *記錄:「在支持的文件系統上,FSCTL_GET_RETRIEVAL_POINTERS操作返回非居民數據的範圍位置。居民數據從不具有範圍位置。」 – wj32 2011-12-30 20:57:49

+0

呃,我想要問一個惱人的問題「爲什麼?」的衝動。 – OnTheFly 2011-12-31 12:24:43

+0

「因爲」:我的十六進制編輯器有一個磁盤編輯器,結合一個特殊的文件資源管理器(它使用DeviceIOControl),可以在編輯卷時知道您正在編輯的內容(參見http://www.iceberg-softwares的.com /博客/的index.php?類別= 1) – az01 2011-12-31 15:44:09

回答

4

該文件可能是常駐文件,這意味着它的數據足夠小以適合其MFT條目。在這裏看到一個更詳細的描述:

http://www.disk-space-guide.com/ntfs-disk-space.aspx

所以你基本上需要找到才能知道其中的數據在磁盤上的MFT條目的位置。你控制這個文件嗎?如果是這樣,最簡單的事情就是確保它總是大於MFT條目的大小(不是文檔化的值,但總是可以做4K或者其他東西)。