4

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

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

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

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


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

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

4

2 回答 2

4

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

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

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

于 2010-07-27T11:20:29.520 回答
0

当 ReadFile 返回少于请求的文件字节数(即不是套接字、管道等)时,MSDN 似乎只说了以下内容:https ://msdn.microsoft.com/en-us/library/windows /desktop/aa365467(v=vs.85).aspx

当同步读取操作到达文件末尾时,ReadFile 返回 TRUE 并将 *lpNumberOfBytesRead 设置为零。

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

一个实际的含义:

  1. 调用 GetFileSizeEx 并分配该函数报告的大小的缓冲区
  2. 调用 ReadFile 请求一次读取整个缓冲区
  3. 程序员不能依赖 ReadFile 不会读取报告读取的字节数的较小块
于 2015-06-26T13:37:47.500 回答