c++ - WriteFileGather - 将缓冲区附加到文件

标签 c++ windows winapi writefile

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

最佳答案

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

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

然后使用作为第 5 个参数传入的 OVERLAPPEDOffsetOffsetHigh 成员设置文件写入的位置.

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

参见 here对于文档。

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

关于c++ - WriteFileGather - 将缓冲区附加到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29740703/

相关文章:

c++ - 在 64 位(或 32 位)Windows 上以 32 位进程访问 >2,3,4GB 文件

c++ - 确定 HWND 是否代表顶级窗口的最佳方法是什么?

windows - 从用户 session 进程打开在服务中创建的 JobObject

c++ - 作为公式一部分的命名常量

c++ - Go 中的 OpenCV(或类似库)

c++ - 使用 C++14 在堆上分配连续二维数组的最佳实践

c++ - QMainWindow 在 show() 后立即关闭

windows - 在Windows中删除Elasticsearch模板

c# - 注册表访问问题

c++ - 如何释放 Network Isolation GetApp ContainerConfig 的输出