【发布时间】:2011-03-16 22:51:17
【问题描述】:
我想编写一个程序来读取 NTFS 卷上所有未使用的集群。 (我正在寻找从意外截断的文件中恢复数据)。
根据this page,我可以调用卷句柄上的 SetFilePointer() 和 ReadFile() 来遍历卷上的每个逻辑集群。但是我怎么知道文件正在使用哪些集群,哪些是免费的?
【问题讨论】:
标签: windows file-io ntfs low-level-io
我想编写一个程序来读取 NTFS 卷上所有未使用的集群。 (我正在寻找从意外截断的文件中恢复数据)。
根据this page,我可以调用卷句柄上的 SetFilePointer() 和 ReadFile() 来遍历卷上的每个逻辑集群。但是我怎么知道文件正在使用哪些集群,哪些是免费的?
【问题讨论】:
标签: windows file-io ntfs low-level-io
为了在 NTFS 卷上获取所有未使用的集群,您必须构建所有文件和流的所有分配的映射。这非常复杂,因为您必须解析非常驻文件属性的扩展列表。还有 MFT。
但是您可以在截断的文件上使用 IOCTL 或 fsutil 文件 queryallocranges 并读取最后一个范围及以后。计算当前文件在哪里结束,你会得到文件 slack。
也就是说,如果文件未压缩或 EFS 加密。
免费或商业数据恢复程序在这里会是一种更快的方式。
【讨论】:
FSCTL_GET_VOLUME_BITMAP 应该正是您正在寻找的,而且应该很快。这是许多组件用来尝试将单个文件碎片整理到一个大的连续空间中的方法。
【讨论】: