确保多个文件的导出是原子的

Ensure that the export of multiple files is atomic

本文关键字:原子的 文件 确保      更新时间:2023-10-16

我必须在C++中实现一个导出器库,它可以格式化不同类型的数据并将其导出为不同类型的文件格式(csv,xml,...)。

每个导出可能包含一堆文件和目录:

data
|-- person
|    |-- joepublic 
|    |    +-- File1.xml
|    |    +-- Annotation.csv
|    |    +-- Annotation2.csv
|    |-- mrsmith
|    |    +-- Balance.bin

现在,在多种情况下,可能会发生导出在其中一个文件中失败的情况。假设我无法编写 Balance.bin,因为格式不正确或磁盘空间不足。

现在我留下了一组不一致的文件,这可能会在读取它们时使另一个应用程序崩溃。

我怎样才能防止自己出现这种不一致的导出,同时减少必要的代码量。周围是否有一些标准过程或库?

我第一次尝试的解决方案是首先将所有文件导出到 temp 目录,然后在成功写入它们后将它们移动到正确的目标目录。

不幸的是,操作系统无法以原子方式链接多个文件的操作。但是,某些操作系统可以提供一些功能(请注意,并非所有操作系统都能保证这一点)。

最简单的方法显然是将所有文件放在一个目录中,然后重命名或移动它。

另一种选择是将文件用作标记finished作为内容的一部分。这将是某种锁:在任何写入操作之前,您将删除它,并在完成后创建它。如果它不存在,则意味着内容可能无法读取,因此您不会阅读它。

我同意这可能看起来很尴尬,但这就是 Word * Microsoft在打开文件*****做的事情。

  * I let you decide if it's a good reference
 ** or used to do
*** at least on CIFS volumes