2011-12-30 86 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或者其他东西)。