假设我有1Mb文件,文件指针位于文件的开头。我调用同步ReadFile:
ReadFile(Handle, Buffer, 1024, Result, nil);
呼叫成功,没有发生错误。结果值(读取的字节数)是否可能小于1024(要读取的字节数)?
我认为对于磁盘文件来说这是不可能的,我不确定ReadFile可以访问的其他资源。在编写可以使用不同资源的通用代码时,我是否应该考虑上述场景?
为了避免哲学推测,我可以将问题重新表述如下:
同步ReadFile执行时没有错误,读取的字节数少于要读取的字节数。我可以确定已达到EOF吗?
答案 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。
实际意义: