确保多个文件的导出是原子的
Ensure that the export of multiple files is atomic
我必须在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
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 递归计数给定目录的文件和所有目录
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 使用VerQueryValue检索应用程序的文件描述
- 使用gcc从静态链接的文件中查找可选符号
- 找不到QtResource文件中的文件
- 为测试目标创建具有不同源文件夹的文件
- 如何处理使用.ui文件生成的.h文件
- 如何打开并写入一个名称取自C++中字符串的文件
- c++多进程编写一个唯一的文件
- g++编译包含的头:没有这样的文件或目录
- C++中原子的替代品<variant>
- 在C++中设置基于操作系统的文件路径
- 更正 CMakeList.txt 用于谷歌测试的文件?
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- C++系统找不到指定的文件错误
- stat() 相对于文件系统是原子的
- 如果文件中不存在qt5中的文件,如何原子创建该文件
- 确保多个文件的导出是原子的