具有重叠 IO 和 ERROR_DISK_FULL 的 WriteFile?

WriteFile with Overlapped IO and ERROR_DISK_FULL?

想知道是否有人知道 WriteFile()(这里是存储团队?)的内部设计,磁盘 drive/file 系统上的文件具有重叠 IO。很明显,当使用系统缓冲区和标准同步 WriteFile() 时,它会检查是否已满磁盘并在 returning 之前分配 space 因为保存实际数据的系统缓存稍后写入(问题导致来自 OS 的延迟写入错误)。

所以问题是:当使用 OVERLAPPED 结构进行异步 WriteFile() 扩展文件超出免费 space 时,是否同样如此?例如它会在等待 IO 之前立即 return ERROR_DISK_FULL 吗?

之所以知道是为了恢复释放磁盘 space,或插入新媒体,然后恢复写入。如果这样做,它是相当直接的,如果在挂起 IO 之后,您可能有一堆排队的 IO,然后必须对其进行同步,并跟踪所有排队项目的附加信息,以防移动到新媒体以调整偏移量等.

TIA!!

异步文件操作(WriteFile() 等)是什么意思 - 这些操作仅对调用者而言是异步的。在内部,它们的工作方式与同步(阻塞)的相同。阻塞调用的实现调用 non-blocking 调用并等待事件,就像您使用 OVERLAPPED 结构一样。 因此,关于 WriteFile 是否会 return ERROR_DISK_FULL 在挂起 IO 之前的问题,答案是否定的。 non-blocking 调用的基本原理不是使磁盘操作 return 结果更快,但允许单个线程并行执行多个 I/O 操作而无需创建多个线程。

如果没有足够的磁盘 space 来完成写入操作 - 当 I/O 操作完成时,您得到 ERROR_DISK_FULL (STATUS_DISK_FULL)。文件系统驱动程序是用STATUS_DISK_FULL(转换为ERROR_DISK_FULL)还是先用return STATUS_PENDING(由win32转换为ERROR_IO_PENDING)完成你的写入请求,然后完成I/O 与 STATUS_DISK_FULL - 这是 未定义。可以两者兼而有之。最终状态将为 ERROR_DISK_FULL,但您不能假设操作将同步或异步完成