【问题标题】:WriteFile function's lpNumberOfBytesWritten parameterWriteFile 函数的 lpNumberOfBytesWritten 参数
【发布时间】:2011-06-27 06:54:18
【问题描述】:

MSDN 说,

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

对于文件或套接字(不是管道),当我同步调用函数时,可以*lpNumberOfBytesWritten小于nNumberOfBytesToWrite(结果为TRUE)。。 p>

如果是这样,为什么(以及何时)相应的驱动程序会这样完成 IRP?

当我看到下面的代码时,我总是担心“如果 *lpNumberOfBytesWritten

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

我不需要担心吗?

【问题讨论】:

    标签: windows sockets winapi file-io filesystems


    【解决方案1】:

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

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

    不要与重叠 I/O 混淆。您在那里安排 I/O 并异步完成(由底层驱动程序)。

    【讨论】:

    • 同步套接字句柄也是如此吗?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      相关资源
      最近更新 更多