2010-07-27 121 views
4

假设我有1Mb文件,文件指针位于文件的开头。我称之为同步ReadFile:通过同步ReadFile读取的字节数

ReadFile(Handle, Buffer, 1024, Result, nil); 

该调用成功,没有发生错误。 Result值(读取的字节数)是否可能小于1024(要读取的字节数)?

我认为这是不可能的磁盘文件,我不确定其他资源可以通过ReadFile访问。我应该在编写可以使用不同资源的通用代码时考虑上述情况吗?


为了避免哲学推测我可以重新配制的问题如下:

同步ReadFile的没有错误被执行,并且字节数读小于数目的阅读。我可以确定已达到EOF吗?

+2

如何保证文件大于缓冲区当你打电话给ReadFile的时候,你正在尝试阅读?这是一个理论问题吗?因为我无法在现实世界中保证它。我会写我的代码来说明它返回的时间少于1024,并且有适当的错误处理(EOF)。 – 2010-07-27 11:20:45

+0

@LarsTruijens,实际上是一个文件(不是管道等):1)调用GetFileSizeEx并分配一个由该函数报告的大小的缓冲区2)调用ReadFile请求一次读取整个缓冲区3)程序员是否可以依赖ReadFile不会读取报告读取字节数的较小块。 – 2015-06-26 13:26:21

回答

4

在你给定的场景中,对于磁盘文件来说,看起来似乎不可能接收到比请求的字节数少的字节数。

但是,编写通用可以使用不同资源的代码,在位置+字节数小于要传输的总字节数的情况下,您不应该总是接受所请求的字节数。

例如READFILE可以返回0字节的成功调用读时调用WriteFile的0字节写命名管道的另一端...

+0

或套接字或其他网络元素。 – 2010-07-27 14:22:36

+0

同意。 ReadFile()明确返回实际读取的字节数。如果需要,检查该值并再次调用ReadFile()会更可靠,然后假定输出计数总是与请求的计数相匹配。 – 2010-07-27 21:09:30

+0

是否有任何对文档的引用,指出当文件包含不少于最初请求的字节数时,ReadFile不会读取文件的较小块并返回该块的大小? – 2015-06-26 13:29:42

0

MSDN似乎是说只有以下w.r.t.当ReadFile的一个文件返回小于请求的字节数(即,不是一个套接字,管道等):当一个同步读取操作到达文件的结尾https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

,ReadFile的返回TRUE和套* lpNumberOfBytesRead为零。

我找不到任何证明或反对,即当文件包含不少于最初请求的字节数时,ReadFile不会读取文件的较小块并返回该块的大小。因此,我正在编写检查ReadFile返回多少个字节的代码,并且只要返回的字节总数小于请求的字节数,就再次调用ReadFile(在循环中),除非ReadFile返回0字节,这意味着EOF根据MSDN。

的实际含义:

  1. 呼叫GetFileSizeEx和分配由 功能
  2. 调用的ReadFile请求读取整个缓冲区报大小的缓冲区一次
  3. 程序员不能靠说ReadFile不会读取较小的 大块报告读取的字节数