【问题标题】:WriteFileGather - append buffers to fileWriteFileGather - 将缓冲区附加到文件
【发布时间】:2015-04-20 06:31:43
【问题描述】:

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

【问题讨论】:

    标签: c++ windows winapi writefile


    【解决方案1】:

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

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

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

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

    有关文档,请参阅 here

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

    【讨论】:

    • @Harry Johnston:它永远不会像问的/暗示的那样覆盖现有文件。它可能会覆盖文件的有效内容如果您通过将偏移量设置为已经存在的数据来要求它
    • @Harry Johnston - 将第一段编辑清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多