Windows ReadFile可以在不读取您要求的所有内容的情况下返回成功吗?

时间:2018-05-25 20:01:50

标签: windows readfile

在unix世界中,一个众所周知的知识是,从文件描述符读取可能会成功,而不会产生您要求的所有数据。你必须专门检查。

我想知道在Windows中是否也是如此。 我们正在进行同步读取,没有任何异步,但我们正在使用重叠结构,因此我们可以指定和偏移以及读取长度。

此...

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

表示:

当出现以下某种情况时,ReadFile函数会返回:     读取请求的字节数。

它还说:

如果lpOverlapped不为NULL,则读取操作从OVERLAPPED结构中指定的偏移量开始,并且ReadFile在读取操作完成之前不会返回。系统在ReadFile返回之前更新OVERLAPPED偏移量。

最后说:

lpNumberOfBytesRead参数应设置为NULL。使用GetOverlappedResult函数获取读取的实际字节数。

但实际发生的事情是我们获得了成功的回报,但读取的字节数(来自调用GetOverlappedResult)比我们要求的要少。

这篇文档中没有任何地方甚至暗示可能会发生,但肯定会发生。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这种说法全是:

https://blogs.msdn.microsoft.com/oldnewthing/20150121-00/?p=44863

我最喜欢的一句话:"为了减少混淆,如果文档没有在中途切换术语,那么文档会更清晰。"

我们显然正在使用他们所谓的"混合型号。"

混合模型的独特之处在于它没有得到很好的记录,而且在记录的地方,它具有误导性。自2015年以来,似乎没有人愿意解决这个问题。

这是一个很好的例子,说明为什么你不应该尝试重载一个函数来执行许多不同的事情,即使它们是核心,它们也会阅读。' 你对管道的异常,以及有位置的东西以及可以以同步的方式异步完成的事情做出异常,你最终会弄得一团糟。输入Win32 api。