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