windows 有没有办法从硬盘中读取碎片文件而不移动它的集群?

ih99xse1  于 2023-06-30  发布在  Windows
关注(0)|答案(1)|浏览(125)

我一直在写一个程序,直接从硬盘读取文件的内容。我在非碎片文件上取得了很大的成功,使用FSCTL_GET_RETRIEVAL_POINTERS,我得到了文件在硬盘上的位置,然后使用SetFilePointerEx,我开始直接从硬盘阅读文件。由于文件没有碎片,我读了硬盘,直到文件大小。
例如:如果文件大小是120345字节,我从硬盘读取120345字节。
当文件被分割时,问题就出现了,现在我知道文件的每个片段从哪里开始,但我不知道每个片段在哪里结束,我希望只读取单个片段并连接结果数据以获得输出。如果卷是一个跨区卷,问题就变得多方面了,因为我还必须处理多个硬盘。
是否有任何API或IOCTL可以用于同步来解决这个问题?

sulc1iza

sulc1iza1#

所以我解决了这个问题。不知何故,我的Extents数组仍然显示一个区段,但为了获得所有碎片数据,我不得不多次调用FSCTL_GET_RETRIEVAL_POINTERS
如果我调用这个函数:

DeviceIoControl(handle,
                FSCTL_GET_RETRIEVAL_POINTERS,
                &StartingVCNK,
                sizeof(STARTING_VCN_INPUT_BUFFER),
                prpb,
                sizeof(RETRIEVAL_POINTERS_BUFFER),
                &nRead,
                NULL);

如果文件被分段并且存在更多的区段,则它将返回ERROR_MORE_DATA。所以我不得不调用DeviceIoControl(),直到它返回ERROR_HANDLE_EOF。此外,我还必须将StartingVCNK更新为上一个扩展区的NextVCN

相关问题