我一直在写一个程序,直接从硬盘读取文件的内容。我在非碎片文件上取得了很大的成功,使用FSCTL_GET_RETRIEVAL_POINTERS,我得到了文件在硬盘上的位置,然后使用SetFilePointerEx,我开始直接从硬盘阅读文件。由于文件没有碎片,我读了硬盘,直到文件大小。
例如:如果文件大小是120345字节,我从硬盘读取120345字节。
当文件被分割时,问题就出现了,现在我知道文件的每个片段从哪里开始,但我不知道每个片段在哪里结束,我希望只读取单个片段并连接结果数据以获得输出。如果卷是一个跨区卷,问题就变得多方面了,因为我还必须处理多个硬盘。
是否有任何API或IOCTL可以用于同步来解决这个问题?
1条答案
按热度按时间sulc1iza1#
所以我解决了这个问题。不知何故,我的Extents数组仍然显示一个区段,但为了获得所有碎片数据,我不得不多次调用
FSCTL_GET_RETRIEVAL_POINTERS
。如果我调用这个函数:
如果文件被分段并且存在更多的区段,则它将返回
ERROR_MORE_DATA
。所以我不得不调用DeviceIoControl()
,直到它返回ERROR_HANDLE_EOF
。此外,我还必须将StartingVCNK
更新为上一个扩展区的NextVCN
。