如何以原子方式将128MB写入文件?

时间:2016-09-09 16:02:06

标签: c++ file

我需要将一个可变大小为16 ... 128 MB的连续块放到一个文件中,不存在使文件结构处于不一致状态的风险(如果出现电源故障或进程死亡)。

通过文件的一致状态,我的意思是保证旧数据可用,并且可以重新使用由失败写入消耗的任何空间。换句话说,每个文件必须能够区分类别和好的数据"和"垃圾"在任何时刻,尽管有任何软件写入失败(我们假设磁盘单元正常)。

文件中最简单的数据结构以及建议提供哪种算法?

相关问题:DBMS(在文件系统上工作的那些(MySQL InnoDB,MongoDB,Redis等),而不是原始HDD(Oracle)之上的那些)如何处理类似的问题?

2 个答案:

答案 0 :(得分:1)

根据您是否需要覆盖或追加,有几种不同的方法。

覆写

如果要覆盖,请按照评论中的建议进行操作。将您的内容写入临时文件,然后将临时文件复制到原始文件上。如果在写入开始时存在临时文件,您将知道出现了问题,您应该丢弃它。如果不是,你可以正常进行。

附加

这个比较棘手。在写入之前可以执行的操作是在文件中附加一个字符串,该字符串不会出现在您的内容中。在删除字符串之前,该字符串之后的任何内容都被视为“可疑”(在写入结束时完成)。同样,如果您开始编写并发现文件中的字符串,则可以将其删除,并将其删除为可疑项。如果您没有遇到它,您可以正常编写它和您的内容。

答案 1 :(得分:1)

这将取决于os。但一般来说,您需要使用无缓冲的IO写入文件的末尾。一旦成功更新某些类型的标头信息,表明新记录已完成。您可以将其与临时文件交换相结合,以获得额外的可靠性。