#write-file #file #write #atomic #fs-file

原子写入文件

以原子方式将文件写入文件系统

5 个版本

0.1.4 2024年4月25日
0.1.3 2024年3月1日
0.1.2 2023年11月30日
0.1.1 2023年11月28日
0.1.0 2023年8月22日

#102 in 文件系统

Download history 33727/week @ 2024-05-04 39536/week @ 2024-05-11 29183/week @ 2024-05-18 31333/week @ 2024-05-25 37133/week @ 2024-06-01 34484/week @ 2024-06-08 23585/week @ 2024-06-15 28154/week @ 2024-06-22 27790/week @ 2024-06-29 33656/week @ 2024-07-06 19140/week @ 2024-07-13 26157/week @ 2024-07-20 20699/week @ 2024-07-27 21768/week @ 2024-08-03 21481/week @ 2024-08-10 27549/week @ 2024-08-17

96,309 每月下载量
用于 6 Crates(其中 2 个直接使用)

BSD-3-Clause

68KB
1K SLoC

原子写入文件

Crate Documentation License

这是一个 Rust crate,它提供将文件写入和覆盖文件的功能,以原子方式,即:不会留下文件处于中间状态。要么将文件的新内容写入文件系统,要么保留旧内容(如果有的话)。

此 crate 实现了两个主要结构体:AtomicWriteFileOpenOptions,尽可能模仿标准 std::fs::OpenOptions

此 crate 支持所有主要平台,包括:Unix 系统、Windows 和 WASI。

动机和示例

考虑以下代码片段,用于以 JSON 格式写入配置文件:

use std::io::Write;
use std::fs::File;

let mut file = File::options()
                    .write(true)
                    .create(true)
                    .open("config.json")?;

writeln!(file, "{{")?;
writeln!(file, "  \"key1\": \"value1\",")?;
writeln!(file, "  \"key2\": \"value2\"")?;
writeln!(file, "}}")?;

此代码打开一个名为 config.json 的文件,如果文件已存在,则截断其内容,并逐行写入 JSON 内容。

如果在所有 writeln! 调用完成之前代码被中断(因为恐慌、收到信号、进程被杀死或文件系统错误),则文件将处于损坏状态:它将不包含有效的 JSON 数据,并且将丢失原始内容(如果有的话)。

AtomicWriteFile 通过仅在完全写入到文件系统后将其新内容放入目标文件来解决此问题。上面的代码片段可以使用 AtomicWriteFile 替换 File 来重写,如下所示:

use std::io::Write;
use atomic_write_file::AtomicWriteFile;

let mut file = AtomicWriteFile::options()
                               .open("config.json")?;

writeln!(file, "{{")?;
writeln!(file, "  \"key1\": \"value1\",")?;
writeln!(file, "  \"key2\": \"value2\"")?;
writeln!(file, "}}")?;

file.commit()?;

注意,此代码与原始代码几乎相同,只是现在使用 AtomicWriteFile 替换 File,并且有一个额外的对 commit() 的调用。

如果代码在调用 commit() 之前被中断,原始文件 config.json 将保持不变。只有当新内容完全写入文件系统后,config.json 才会获取这些内容。

文档

参考资料、示例、内部细节和限制均可在 docs.rs/atomic-write-file 上找到。

依赖项

~2MB
~41K SLoC