我必须在C ++中实现一个导出器库,它可以格式化并将不同类型的数据导出为不同类型的文件格式(csv,xml,...)。
每个导出可能包含一堆文件和目录:
data
|-- person
| |-- joepublic
| | +-- File1.xml
| | +-- Annotation.csv
| | +-- Annotation2.csv
| |-- mrsmith
| | +-- Balance.bin
现在可能会在多种情况下发生导出在其中一个文件中失败的情况。让我们假设,我无法写Balance.bin,因为格式不正确或我的磁盘空间不足。
现在我留下了一组不一致的文件,这些文件在阅读时可能会使另一个应用程序崩溃。
如何防止出现这种不一致的导出,同时减少必要的代码量。是否有一些标准程序或库?
我首次尝试解决方案是首先将所有文件导出到临时目录,然后成功写入它们以将它们移动到正确的目标目录。
答案 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