繁体   English   中英

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

[英]How can I find information about a file from logical cluster number in NTFS/FAT32?

我正在尝试通过Windows碎片整理API( http://msdn.microsoft.com/zh-cn/library/aa363911 ( VS.85 ) .aspx )对单个文件进行碎片整理,但是如果没有足够的可用空间块供我使用我想移动文件的其他部分以为其腾出空间。

链接的文章提到了其他文件的移动部分,但是我找不到有关如何找出要移动的文件的任何信息。 从可用空间位图中,我可以找到几乎足够大的空间,并且知道周围的逻辑簇号,但是从中,我无法找到周围的文件,并且需要文件的句柄来执行FSCTL_MOVE_FILE的移动文件的一部分。

是否可以通过API或通过解析MFT找出逻辑集群号属于哪个文件,以及文件中的哪个虚拟集群号与通过位图找到的逻辑集群号相对应?

一种慢速但兼容的方法是递归扫描所有目录中的文件,然后使用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表和包含根目录文件的群集。 您需要分析目录条目并递归地找到子目录的群集。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM