我想要一些 C++11 输出流,只有当新写入的内容与以前的内容不同时才写入文件(如果内容与磁盘上现有的内容相同,我不想要更改原始文件的元数据)。
FWIW,该程序在 GNU/Linux/Debian/Sid x86-64 上,由最近的 GCC 5 编译(或以后)。它是一个类似服务器的程序,最多只有一个进程运行它。没有其他进程应该写入系统上的该文件。
我想避免覆盖现有相同文件内容的原因是因为实际输出是一些 *.h
C++ 头文件....(如果这很重要,它是 future MELT 监视器的新化身,我正在用 C++11 重新设计和重写 this),我不想要 future make
如果生成的头文件未更改,则构建以根据它重新编译内容。
我很想继承 std::ofstream
(然后,初始文件路径将是一些临时路径名)或 std::ostringstream
(然后,整个文件内容都保存在内存中,对我来说没什么大不了的),并重新定义它的 close
方法将磁盘上的新内容与旧内容进行比较,只有当内容发生变化时才重写磁盘文件。
但我觉得它闻起来不好(甚至不对),特别是因为 std::ofstream::close未记录为 virtual
.我应该使用 std::filebuf 吗?相反?
我有很多现有的 operator <<
左操作数为 std::ostream&
正确的是我自己的一些类(class),我想在我的特殊流中使用它们。
我已经有很多功能可以输出到任何 std::ostream
我想在这样的“差异”文件流上使用其中的一些...
或者我应该继承自 std::ostream
(因此我稍微更改了最初提到的问题的标题 std::ofstream
,而不是 std::ostream
)?
我会在关闭时比较新旧内容(只需关闭临时文件,然后读取它和旧文件,然后逐字节比较)。
最佳答案
不要。流是数据流,而不是文件。让这个功能在流附近的任何地方都是不合适的。如果不出意外,尽管您可能会破解一种方法来尽早确定源和目标是否相同,但这会破坏流的 FIFO 模型。它们只是不适合这项工作的工具。
将文件生成到临时位置,然后执行 md5sum
比较并将其移动(通过覆盖)到目标路径 iff 内容不同;否则只需删除临时文件。当然,它不需要比这更复杂。
关于c++ - 从 std::ostream 继承(以避免重写相同的旧内容)...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809675/