我想编写一个程序来读取 NTFS 卷上所有未使用的集群。(我正在寻找从意外截断的文件中恢复数据)。
根据这个页面,我可以在卷句柄上调用 SetFilePointer() 和 ReadFile() 来遍历卷上的每个逻辑集群。但是我怎么知道文件正在使用哪些集群,哪些是免费的?
我想编写一个程序来读取 NTFS 卷上所有未使用的集群。(我正在寻找从意外截断的文件中恢复数据)。
根据这个页面,我可以在卷句柄上调用 SetFilePointer() 和 ReadFile() 来遍历卷上的每个逻辑集群。但是我怎么知道文件正在使用哪些集群,哪些是免费的?
为了获得 NTFS 卷上所有未使用的集群,您必须构建所有文件和流的所有分配的映射。这是非常复杂的,因为您必须解析非常驻文件属性的扩展列表。还有 MFT。
但是您可以在截断的文件上使用 IOCTL 或 fsutil 文件 queryallocranges 并读取最后一个范围及以后。计算当前文件的结束位置,您将获得文件松弛。
也就是说,如果文件未压缩或 EFS 加密。
免费或商业数据恢复程序将是一种更快的方式。
FSCTL_GET_VOLUME_BITMAP应该正是您正在寻找的,并且应该很快。这是许多组件用来尝试将单个文件碎片整理到一个大的连续空间中的方法。