使用场景是工业的(不稳定的电源和其他故障程序/硬件)。当电源关闭(或蓝屏崩溃)时,程序必须不受影响地返回。操作系统是Windows 7和NTFS。
我使用boost::property_tree写json将参数记录到人类可读的文本文件中。
boost::property_tree::write_json("logic.txt", pt);有时,当系统停止时,它实际上删除了"logic.txt“。我使用默认的ios::out读取boost源文件和write_json流调用
std::basic_ofstream<typename Ptree::key_type::value_type> stream(filename.c_str()); 问题应该是流擦除现有文件,并在系统故障时留下空白文件。
这是已知的问题吗?对此,最合适的解决办法是什么?我能想到几个:
任何建议都会有帮助。
发布于 2016-08-10 05:07:07
简单的解决方案是#1:写入临时文件,然后重命名。但是,请注意,为了使重命名是原子的,临时文件应该位于同一个文件系统上。最安全的方法是将其存储在同一个目录中。当然,您可以使用mkstemp()或类似的方法来确保您有一个唯一的临时文件名。
在所有可能的系统上,以上仍然不是100%的保证,因为它取决于您的文件系统语义(您没有告诉我们您使用的是哪个文件系统)。
如果您想要一个更好的防弹解决方案,那么您的第二种解决方案是个好主意:使用SQLite。它已经在很多像你描述的场景中进行了测试。请参阅https://www.sqlite.org/testing.html
https://stackoverflow.com/questions/38863874
复制相似问题