如何查找NTFS逻辑集群是否空闲?

时间:2010-07-16 12:53:45

标签: windows file-io ntfs low-level-io

我想编写一个程序来读取NTFS volumne上所有未使用的集群。 (我希望从意外截断的文件中恢复数据)。

根据this page,我可以在卷句柄上调用SetFilePointer()和ReadFile()来遍历卷上的每个逻辑集群。但是,我怎么知道文件正在使用哪些集群,哪些集群是免费的?

2 个答案:

答案 0 :(得分:1)

为了获取NTFS卷上所有未使用的集群,您必须构建所有文件和流的所有分配的映射。这非常复杂,因为你必须解析非常驻文件属性的exntent列表。和MFT。

但您可以在截断的文件上使用IOCTL或fsutil文件queryallocranges并读取最后一个范围及更高范围。计算当前文件结束的位置,你将得到文件松弛。

即文件未压缩或EFS加密。

免费或商业数据恢复计划将是一种更快捷的方式。

答案 1 :(得分:1)

FSCTL_GET_VOLUME_BITMAP应该是您正在寻找的,而且应该非常快。这就是许多组件用来尝试将单个文件碎片整理到一个大的连续空间中的原因。