Expand description
原子文件写入与临时明文文件的生命周期管理。
§为什么需要这个模块
加密写入若在中途崩溃或断电,可能留下一个看似完整实则损坏的 .omy 文件——
头部已落盘、载荷只写了一半,用户以为加密成功并删除了原文件,数据就永久丢失了。
本模块实现规范 §10 的五步流程:
1. 写入 <target>.<pid>.<nonce>.tmp
2. fsync(文件)
3. fsync(父目录) ← 容易遗漏,但在部分文件系统上必需
4. rename(tmp → target) ← 同文件系统内原子
5. fsync(父目录)§关于父目录 fsync
只 fsync 文件本身是不够的:文件数据虽已落盘,但「目录里存在这个文件名」
这条元数据可能仍在缓存中。断电后可能出现文件内容完好但目录项丢失的情况。
在 ext4 的 data=ordered 模式、XFS、Btrfs 上这都是真实风险。
Windows 无法直接 fsync 目录,NTFS 的 rename 本身是有日志的元数据事务,
因此该步在 Windows 上跳过(见 sync_dir)。
§临时明文文件(旁路 L2/L3/L5)
TempPlaintext 用于「用外部应用打开」场景。它必须处理三个旁路泄露:
系统缩略图缓存、搜索索引、以及文件本身的残留。见该类型的文档。
Structs§
- Atomic
Writer - 流式原子写入器。
- Temp
Plaintext - 受控的临时明文文件,用于「以外部应用打开」。
Constants§
- PROGRESS_
SUFFIX - 断点续传的进度文件后缀(移动端后台挂起场景,规范 §10)。
- TMP_
SUFFIX - 原子写入使用的临时文件后缀。
Functions§
- cleanup_
stale - 清理指定目录下遗留的
.tmp与.progress文件。 - mark_
dir_ no_ index - 标记目录不被系统搜索索引与缩略图缓存收录(旁路 L3/L5)。
- restrict_
permissions - 把文件权限收紧到仅所有者可读写。
- sync_
dir - fsync 一个目录,确保其中的目录项变更已落盘。
- write_
atomic - 原子地把
data写入target。