使用Windows API的WriteFileGather
,我正在向磁盘写入文件。
我想将新缓冲区附加到现有文件中。
阻止WriteFileGather
覆盖现有文件的方法是什么?
答案 0 :(得分:2)
WriteFileGather
永远不会覆盖该文件,除非您要求它 - 没有隐含的覆盖/附加选项,只有#请在文件位置X选项中写入数据'。
您应该正常打开文件句柄(确保您已获得GENERIC_WRITE
访问权限,并使用FILE_FLAG_OVERLAPPED
<指定至少标记FILE_FLAG_NO_BUFFERING
和CreateFile
的标记/ p>
然后,使用您传入的Offset
的{{1}}和OffsetHigh
成员作为第5个参数,设置文件写入的位置。
这类似于OVERLAPPED
在异步模式下运行时的工作方式 - 必须指定要写入的位置。使用WriteFile
可能更容易学习如何使用WriteFile
执行位置异步写入,如果需要额外的功能,则先移至WriteFileGather
。
有关文档,请参阅here。
编辑:要回答Harry的评论,要获得文件结尾,您可以记住之前写过多少(假设这是您创建的新文件)或从HANDLE获取当前文件大小使用距离为0的SetFilePointerEx和方法FILE_END,它将返回给您文件的末尾。还有其他获取文件大小的方法,但要注意你可能会得到一个缓存的答案(例如,如果在目录上进行迭代),所以建议使用以上方法。