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

标签 c++ file

<分区>

我需要将大小为 16...128 MB 的连续 block 放入一个文件中,而不会有使文件结构处于不一致状态的风险(在电源故障或进程终止的情况下)。

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

文件中最简单的数据结构是什么?可以提出什么算法来提供它?

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

最佳答案

有几种不同的方法,具体取决于您是需要覆盖还是追加。

覆盖

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

追加

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

关于c++ - 如何以原子方式将 128MB 写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39415560/

相关文章:

c++ - 为什么宏: RAND_MAX ,的最小值是32767

c++ - 使用正弦或余弦函数在 C/C++ 中实现 3D 烟花效果

file - Yii2中的函数下载

c++ - 如何从文件名 vector 中删除隐藏文件?

iphone - 列出 iPhone 应用程序文档文件

PHP 使用按钮下载、删除和重命名文件

c++ - 在 createddialog 创建的窗口中捕获 OnMouseMove 消息以进行编辑控件?

c++ - visual studio 中静态成员函数的默认调用约定是什么?

c++ - 模板基类中的静态变量

c - 如何获取每行中的字符数?