使用 Windows API 的 WriteFileGather
,我正在将文件写入磁盘。
我想将新缓冲区附加到现有文件。
有什么方法可以防止WriteFileGather
覆盖已有文件?
最佳答案
WriteFileGather
永远不会覆盖文件,除非您要求它 - 没有隐含的覆盖/追加选项,只有“请在文件位置 X 选项写入数据”。
您应该正常打开文件句柄(确保您有 GENERIC_WRITE
访问权限并至少指定标志 FILE_FLAG_OVERLAPPED
和 FILE_FLAG_NO_BUFFERING
使用 CreateFile
然后使用作为第 5 个参数传入的 OVERLAPPED
的 Offset
和 OffsetHigh
成员设置文件写入的位置.
这类似于 WriteFile
在异步模式下运行时的工作方式 - 您必须指定要写入的位置。首先使用 WriteFile
学习如何进行位置异步写入可能更容易,如果您需要它的额外功能,然后再使用 WriteFileGather
。
参见 here对于文档。
编辑:要回答 Harry 的评论,要获得文件结尾,您可以记住之前写了多少(假设这是您创建的新文件)或使用 SetFilePointerEx 从 HANDLE 获取当前文件大小距离 0 和方法 FILE_END 将返回给你文件的末尾。还有其他获取文件大小的方法,但请注意您可能会得到缓存的答案(例如,如果遍历目录),因此建议使用上述方法。
关于c++ - WriteFileGather - 将缓冲区附加到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29740703/