我有一个~100KB长的文件,由operator <<
上std::ofstream
的单个作者每隔几分钟覆盖一次。我想避免任何类型的部分写作&#34;在将文件刷新到磁盘时可能由系统断电引起的情况。我想在我的软件中执行此操作,就像OS / POSIX允许的那样。
我的想法是使用重写覆盖策略,即将flush()
所有数据转换为临时文件名,然后将临时文件名重命名为最终文件名。
我的问题是,这是一个好的策略,在某种意义上,我的POSIX OS(例如Linux)保证重命名的原子性,或者你有更好的想法(不涉及硬件修改,可能没有FS标志修改)在内核/系统级别)
答案 0 :(得分:1)
如果您不信任重命名的原子性 - 并且在非日志文件系统崩溃的情况下您也无法 - 那么您可以先使用临时名称重命名原始文件,然后将新文件重命名为原始名称,然后仅使用临时名称删除原始文件。这样,如果发生崩溃,三个文件路径中的至少一个目前不会被修改。
答案 1 :(得分:0)
一般来说,这是您可以实现的最佳方式。从应用程序的角度来看,它将充当原子操作。
但是,您仍需要在操作系统中获得一些支持,即日志文件系统。只要您使用ext4,reiser,zfs,xfs或任何其他现代文件系统,此解决方案将以正确的顺序将数据刷新到底层硬件。有了fat / vfat,它可能无法正常工作。