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

时间:2016-02-18 09:42:27

标签: c++ export

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

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

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

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

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

如何防止出现这种不一致的导出,同时减少必要的代码量。是否有一些标准程序或库?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

我同意这可能看起来很尴尬,但这就是Microsoft Word *在打开文件**时正在***进行的操作。

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