fix: 保持产物收尾幂等并保护批量成品完整性

This commit is contained in:
2026-09-11 16:12:32 +08:00
parent f3faad0391
commit 3a612919f7
8 changed files with 293 additions and 43 deletions
+26
View File
@@ -0,0 +1,26 @@
"""产物文件操作:以同目录临时文件复制并原子替换,避免暴露写到一半的成品。"""
from __future__ import annotations
import shutil
import tempfile
from pathlib import Path
def atomic_copy(source: Path, target: Path) -> None:
"""保留源文件,完整复制后替换目标;失败清理临时文件并保留原目标。
临时文件与目标位于同一目录,确保 replace 不跨文件系统;关闭句柄后再
copy2/replace,兼容 Windows。原子性针对单个文件,不承诺多文件事务或
断电持久性;调用方仅在全部必需文件复制成功后登记完成并清理工作空间。
"""
target.parent.mkdir(parents=True, exist_ok=True)
with tempfile.NamedTemporaryFile(
dir=target.parent, prefix=f".{target.name}.", suffix=".tmp", delete=False
) as handle:
temporary = Path(handle.name)
try:
shutil.copy2(source, temporary)
temporary.replace(target)
finally:
temporary.unlink(missing_ok=True)