【问题标题】:It seems FlushFileBuffers() doesn't set end-of-file (and therefore can lead to corrupted files)似乎 FlushFileBuffers() 没有设置文件结尾(因此可能导致文件损坏)
【发布时间】:2021-04-20 23:58:27
【问题描述】:

考虑使用进程监视器捕获的以下调用序列:

这里发生了什么:

  1. 文件已打开
  2. 15 字节文件写入
  3. FlushFileBuffers() 已拨打电话
  4. ...导致操作系统发出 4kb 文件写入
  5. 文件句柄通过Close()关闭
  6. ... 导致 SetEndOfFileInformation() 调用将文件结尾设置为 15

这使我得出结论,在 #4 之后(但在 #6 之前)拉网线(或崩溃的服务器等)将导致服务器上的文件损坏。因此成功的FlushFileBuffers() 调用并不能保证文件在中断时不会损坏。

这反过来意味着Close() 总是会失败(即使在成功FlushFileBuffers() 之后),因此不能隐藏在一些析构函数中。它必须始终是一个显式调用(除非您由于其他错误已经回滚/展开)。

我说的对吗?如果不是 - 为什么?

【问题讨论】:

  • 不是直接回答您的问题,但SetEndOfFile 对您有用吗?
  • @PaulSanders(假设SetEndOfFile()Close() 之前不会被缓存)你是否建议用明确的SetEndOfFile() 来补充FlushFileBuffers()
  • 是的,如果有效的话。看来你有工具可以检查。
  • @PaulSanders 好吧,这个帖子是关于FlushFileBuffers() 来确认它是否有问题(没有给出)。如果出现问题 - 最好的解决方法是关闭并重新打开文件(或简单地 ReOpenFile()),而不是调用 SetEndOfFile()...
  • 文件结束是由文件的大小而不是文件中的数据决定的。 "Testing for the End of a File" 您能否展示一个实际示例来演示 FlushFileBuffers() 如何损坏文件?

标签: c++ windows winapi


【解决方案1】:

没有。根据进一步调查,第二次写入(步骤 #4)不会改变文件大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2019-04-11
    • 2021-10-20
    • 2017-06-25
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多