IO和ERROR_DISK_FULL重叠的WriteFile?

时间:2019-07-10 05:18:48

标签: windows file asynchronous winapi storage

想知道是否有人知道WriteFile()(存储团队在这里吗?)的内部设计,其中磁盘驱动器/文件系统上文件的IO重叠。显然,在使用系统缓冲区和标准同步WriteFile()时,它会检查已满磁盘并在返回之前分配空间,这是因为保存实际数据的系统高速缓存会在以后写入(问题导致来自OS的延迟写入错误)。

问题是:将OVERLAPPED结构用于将文件扩展到可用空间之外的异步WriteFile()时,是否也是如此?例如是否会在等待IO之前立即返回ERROR_DISK_FULL

要知道的原因是要恢复释放的磁盘空间,插入新的介质并恢复写操作。如果采用这种方式,这很简单,如果在挂起IO之后,您可能会有一堆排队的IO,然后必须对其进行同步,并跟踪所有排队项目的其他信息,以防转移到新介质上以调整偏移量等。

TIA !!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

如果没有足够的磁盘空间来完成写入操作-I / O操作将完成时,您将获得ERROR_DISK_FULLSTATUS_DISK_FULL)。是文件系统驱动程序,只需使用STATUS_DISK_FULL完成您的写入请求(转换为ERROR_DISK_FULL)或首先返回STATUS_PENDING(由win32转换为ERROR_IO_PENDING),然后使用{完成I / O {1}}-这是未定义。可以两者兼而有之。最终状态将为STATUS_DISK_FULL,但您不能假定操作将完成同步还是异步