WriteFile函数的lpNumberOfBytesWritten参数

时间:2011-06-27 06:54:19

标签: windows sockets winapi file-io filesystems

MSDN说,

  

写入非阻塞的字节模式时   缓冲区空间不足的管道句柄,WriteFile返回TRUE,* lpNumberOfBytesWritten< nNumberOfBytesToWrite。

对于文件或套接字( not pipe ),当我同时调用函数 时,* lpNumberOfBytesWritten可以小于nNumberOfBytesToWrite(并且结果为TRUE)。

如果是这样,为什么(和什么时候)对应的驱动程序会像那样完成IRP?

当我看到下面的代码时,我总是担心“如果* lpNumberOfBytesWritten< BytesToWrite会怎么样?”

BOOL fOk = WriteFile(hFileOrSocket, ...); // Synchronously
if (fOk)
{
  // It assumes everything is fine
}

我不需要担心吗?

2 个答案:

答案 0 :(得分:2)

AFAIK如果为同步写入打开了文件句柄 - 您描述的情况(*lpNumberOfBytesWritten < BytesToWritten)将永远不会发生。

部分写入的重点是让您有机会在失败之前编写部分数据,例如WSAEWOULDBLOCK或类似错误。异步I / O模型表示尽可能多地写入,直到得到适当的错误,然后等到某些I / O完成。

不要与重叠的I / O混淆。在那里,您可以安排I / O并以异步方式完成(通过底层驱动程序)。

答案 1 :(得分:0)

“对于文件或套接字(不是管道),”

对于一个文件,应该很容易想象。

实验也很容易。创建一个大小为100 MB的硬盘分区,打​​开一个文件,写入99 MB,然后尝试再写99 MB。该实验可能不可靠,因为某些版本的Windows可能会返回FALSE,但很容易想象其他版本的Windows可能会返回TRUE且* lpNumberOfBytesWritten小于nNumberOfBytesToWrite。