gpt4 book ai didi

windows - 如何从 NTFS/FAT32 中的逻辑簇号查找有关文件的信息?

转载 作者:可可西里 更新时间:2023-11-01 10:40:32 26 4
gpt4 key购买 nike

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

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

有没有什么办法,通过API或者解析MFT,找出逻辑簇号是哪个文件的一部分,文件中的虚拟簇号对应于通过位图找到的逻辑簇号?

最佳答案

缓慢但兼容的方法是递归扫描所有目录中的文件,并使用 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 表和包含根目录文件的簇。您需要解析目录条目并递归定位子目录的簇。

关于windows - 如何从 NTFS/FAT32 中的逻辑簇号查找有关文件的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com