我在我的 Win7 上针对 NTFS 卷测试NtReadFile()
功能,并注意到在以下代码中(句柄是用FILE_SYNCHRONOUS_IO_NONALERT
标志打开的):
IO_STATUS_BLOCK io;
NTSTATUS r = NtReadFile(h, NULL, NULL, NULL, &io, buf, buf_size, &pos, NULL);
io.Information
(应该包含接收的字节数)仅在r == STATUS_SUCCESS
. 如果r == STATUS_END_OF_FILE
io.Information 包含原始垃圾并且(似乎)在该调用中没有读取数据。
r == STATUS_SUCCESS
那么,我可以假设io.Information < buf_size
我们是否已经到达文件末尾?还是我应该一直打电话NtReadFile
直到它回来STATUS_END_OF_FILE
?(即短读是可能的)。
一方面,微软声称短读是不可能的:
NtReadFile ... 在下列条件之一下终止读取操作:
- 缓冲区已满,因为已读取 Length 参数指定的字节数。因此,在没有溢出的情况下,不能再将数据放入缓冲区。
- 在读取操作期间到达文件末尾,因此文件中没有更多数据要传输到缓冲区中。
...我想避免不必要的NtReadFile
电话。另一方面,我的经验表明永远不要 100% 相信微软。