【发布时间】:2021-04-20 23:58:27
【问题描述】:
考虑使用进程监视器捕获的以下调用序列:
这里发生了什么:
- 文件已打开
- 15 字节文件写入
-
FlushFileBuffers()已拨打电话 - ...导致操作系统发出 4kb 文件写入
- 文件句柄通过
Close()关闭 - ... 导致
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() 如何损坏文件?