我试图通过Windows碎片整理API( http://msdn.microsoft.com/en-us/library/aa363911 ( VS.85 ) .aspx )对单个文件进行碎片整理,但是如果没有足够大的可用空间块文件我想移动其他部分的文件,以腾出空间。
链接的文章提到移动其他文件的部分,但我找不到有关如何找出哪些文件移动的任何信息。 从自由空间位图我可以find一个足够大的空间,我知道围绕它的逻辑簇编号,但是从这我不能找出哪些文件围绕它,并需要一个文件的句柄来做FSCTL_MOVE_FILE哪些移动部分文件。
有什么办法,通过API或通过parsingMFT来找出逻辑簇号码所属的文件,以及文件中的虚拟簇号码是否与通过位图find的逻辑簇号码相对应?
慢但兼容的方法是递归扫描所有目录的文件,并使用FSCTL_GET_RETRIEVAL_POINTERS 。 然后扫描正在讨论的群集的结果VCN-LCN映射。
另一个选择是查询驱动器的USN日志获取文件引用ID,然后使用FSCT_GET_NTFS_FILE_RECORD获取$ MFT文件记录。
我目前正在研究一个简单的碎片整理程序(用Java编写),目的是将一个目录(例如一个大型游戏的所有文件)的文件打包在一起,以减少加载时间和加载滞后。
我使用更快的方法来检索NTFS或FAT32驱动器上的文件映射。
我直接解析$ MFT文件(格式有一些陷阱),或FAT32文件分配表和目录。
诀窍是使用FileCreate打开驱动器(例如“c:”)以完全共享GENERIC读取。 然后可以使用FileRead和FileSeek以字节粒度读取结果句柄。 这只适用于管理员模式(或提升)。
在NTFS上,$ MFT可能被分割,从引导扇区信息中找到它有点棘手。 我使用C:\ $ MFT文件上的FSCTL_GET_RETRIEVAL_POINTERS来获取它的簇。
在FAT32上,必须解析引导扇区才能找到FAT表和包含根目录文件的集群。 您需要解析目录条目并递归地定位子目录的集群。
没有O(1)从块#映射到文件的方式。 您需要遍历整个MFT查找包含该块的文件。
当然,在现场系统中,一旦您读取的数据已经过时,您必须为移动数据FSCTL中的故障做好准备。