同步ReadFile读取的字节数

时间:2010-07-27 11:01:34

标签: c delphi winapi readfile

假设我有1Mb文件,文件指针位于文件的开头。我调用同步ReadFile:

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

呼叫成功,没有发生错误。结果值(读取的字节数)是否可能小于1024(要读取的字节数)?

我认为对于磁盘文件来说这是不可能的,我不确定ReadFile可以访问的其他资源。在编写可以使用不同资源的通用代码时,我是否应该考虑上述场景?


为了避免哲学推测,我可以将问题重新表述如下:

同步ReadFile执行时没有错误,读取的字节数少于要读取的字节数。我可以确定已达到EOF吗?

2 个答案:

答案 0 :(得分:4)

在您的给定方案中,对于磁盘文件来说,似乎不可能接收到比请求的字节数更少的字节读取。

但是,编写可以使用不同资源的通用代码,在请求的位置+字节小于总字节数的情况下,不应该总是依赖于所请求的字节数转移。

例如,当一个名为WriteFile的命名管道的另一端写入0字节时,Readfile可以在成功调用时返回0字节读取...

答案 1 :(得分: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不会读取较小的 chunk报告读取的字节数