关闭 fstream 是不是保证文件系统同步?
Posted
技术标签:
【中文标题】关闭 fstream 是不是保证文件系统同步?【英文标题】:Does closing an fstream guarantee a filesystem sync?关闭 fstream 是否保证文件系统同步? 【发布时间】:2013-10-31 01:09:03 【问题描述】:关闭 fstream 是否保证同步到文件系统?我正在与一位同事讨论这个问题,需要一个明确的参考。我对标准所说的内容以及在使用 Visual Studio 实现的 Windows 上发生的事情感兴趣。
另外,如果关闭并不意味着同步,是否有标准的 C++ 方法来确保同步完成?
【问题讨论】:
查看答案:***.com/a/13358458/717732 Force write of a file to disk 的可能重复项 - 它不是此问题的确切重复项,但其中一个很好的答案完全匹配。 您无需关心后续程序的“数据是否在磁盘上”。即使它只是在文件系统缓存中,下面的程序也会看到它。否则操作系统会严重损坏。你当然可以依赖fclose()
暗示 fflush().
@EJP:然后阅读标准并停止猜测:§ 27.9.1.4(又名 [filebuf.members]),第 6 项:“...函数关闭文件(好像通过调用 @ 987654325@)。”
@static_rtti 来自 C11 草案(我没有最终文档):7.21.5.1 说“成功调用 fclose 函数会导致流指向的流被刷新并关联要关闭的文件。流的任何未写入的缓冲数据都将传递到主机环境以写入文件 [...]"。如果数据可能丢失,关闭文件有什么意义?如果当然不能保证操作系统不会在某处缓存操作,这就是操作系统的问题,请阅读操作系统文档。在 POSIX 上,我们可以使用 fsync()
来确保数据安全。
【参考方案1】:
我很确定它已经解决了关闭文件流如何关闭缓冲区的问题。所以,现在,缓冲区:
draft of Std'1998: 27.8.1.3.6: basic_filebuf* close();
6 效果:如果 is_open() == false,则返回一个空指针。如果存在放置区域,则调用 overflow(EOF) 以刷新字符。 (...) 最后它关闭文件 (''as if'' 通过调用 std::fclose(file)).308) 如果任何对溢出或 std::fclose 的调用失败然后关闭失败。
现在,请参阅overflow()
:27.8.1.4.8 (...)
然后我试图进一步追踪它,在下面的某个地方有一些对sync
和sputc
的引用,但我无法追踪overflow
如何保证冲洗的确切措辞。确实如此,但抱歉,我今天的时间到了:/
【讨论】:
感谢您的努力!我希望有资格的人可以从那里接手。【参考方案2】:std::basic_filebuf::close
调用std::fclose
,它声明:“任何未写入的缓冲数据都被刷新到操作系统”,或者根据the C99 standard draft n1256,“任何未写入的流缓冲数据都被传递到主机环境以写入文件”。
【讨论】:
以上是关于关闭 fstream 是不是保证文件系统同步?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 fstream::open() 检查 C++ 中是不是存在文件