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