Windows 如何从NTFS/FAT32中的逻辑群集号中查找有关文件的信息?

Windows 如何从NTFS/FAT32中的逻辑群集号中查找有关文件的信息?,windows,ntfs,fat32,defragmentation,Windows,Ntfs,Fat32,Defragmentation,我试图通过Windows碎片整理API()对单个文件进行碎片整理,但如果没有足够大的可用空间块来存放我的文件,我希望移动文件的其他部分以腾出空间 链接的文章提到了其他文件的移动部分,但我找不到关于如何确定要移动哪些文件的任何信息。从自由空间位图中,我可以找到一个几乎足够大的空间,我知道它周围的逻辑群集号,但从中我无法找到它周围的文件,并且需要文件句柄来执行FSCTL_MOVE_FILE,它移动部分文件 有没有办法,通过API或解析MFT,找出逻辑群集号所属的文件,以及文件中的虚拟群集号与通过位图

我试图通过Windows碎片整理API()对单个文件进行碎片整理,但如果没有足够大的可用空间块来存放我的文件,我希望移动文件的其他部分以腾出空间

链接的文章提到了其他文件的移动部分,但我找不到关于如何确定要移动哪些文件的任何信息。从自由空间位图中,我可以找到一个几乎足够大的空间,我知道它周围的逻辑群集号,但从中我无法找到它周围的文件,并且需要文件句柄来执行FSCTL_MOVE_FILE,它移动部分文件


有没有办法,通过API或解析MFT,找出逻辑群集号所属的文件,以及文件中的虚拟群集号与通过位图找到的逻辑群集号相对应?

缓慢但兼容的方法是递归扫描所有目录中的文件,并使用。然后扫描所产生的VCN-LCN映射以查找相关集群

另一个选项是查询驱动器的USN日志以获取文件引用ID,然后使用以获取$MFT文件记录

我目前正在开发一个简单的碎片整理程序(用Java编写),目的是将目录中的文件(例如大型游戏中的所有文件)打包在一起,以减少加载时间和加载延迟

我使用更快的方法检索NTFS或FAT32驱动器上的文件映射

我直接解析$MFT文件(该格式有一些缺陷),或者解析FAT32文件分配表以及目录

诀窍是使用FileCreate打开驱动器(例如“c:”),以进行完全共享的一般读取。然后,可以在字节粒度上使用FileRead和FileSeek读取结果句柄。这仅适用于管理员模式(或提升模式)

在NTFS上,$MFT可能是分段的,从引导扇区信息中查找它有点困难。我使用C:\$MFT文件上的FSCTL\u GET\u RETRIEVAL\u指针来获取其集群

在FAT32上,必须解析引导扇区以定位FAT表和包含根目录文件的集群。您需要解析目录条目并递归地定位子目录的集群。

没有O(1)方式从块映射到文件。您需要遍历整个MFT以查找包含该块的文件


当然,在实时系统中,一旦您读取了数据,它就过时了,您必须为移动数据FSCTL中的故障做好准备。

作为更新,Windows 7在一次操作中提供了来自集群的
FSCTL\u LOOKUP\u STREAM\u。