1

使用 Windows API WriteFileGather,我正在将文件写入磁盘。我想将新缓冲区附加到现有文件中。防止WriteFileGather覆盖现有文件的方法是什么?

4

1 回答 1

2

WriteFileGather除非您要求,否则永远不会覆盖文件 - 没有隐含的覆盖/附加选项,只有一个“请在文件位置 X 选项写入数据”。

您应该正常打开文件句柄(确保您有权GENERIC_WRITE访问并至少指定标志标志FILE_FLAG_OVERLAPPEDFILE_FLAG_NO_BUFFERING使用CreateFile

然后,您通过使用作为第 5 个参数传入的OffsetOffsetHigh成员来设置文件写入的位置。OVERLAPPED

这类似于WriteFile在异步模式下运行时的工作方式 - 您必须指定要写入的位置。学习如何进行位置异步写入可能更容易,WriteFile如果WriteFileGather您需要它的额外功能,请先使用它。

有关文档,请参见此处

编辑:要回答 Harry 的评论,要获得文件结尾,您可以记住您之前写了多少(假设这是您创建的新文件)或使用距离 0 的 SetFilePointerEx 从 HANDLE 获取当前文件大小和方法 FILE_END 它将返回给您文件的结尾。还有其他获取文件大小的方法,但请注意您可能会得到缓存的答案(例如,如果遍历目录),因此建议使用上述方法。

于 2015-04-20T09:36:15.303 回答