Shuery
79f83f6760
fix: manifest 先删后移会丢账本;5.1 拿不到原子替换;空目录让空间守卫静默失效
四件事都在"原子替换与空间守卫"这条线上:
1) Write-BaknretManifest 自己写了"写 .tmp → 删旧 → Move-Item"。Move-Item 一失败,
旧 manifest 就已经没了 —— 而 manifest 是"这块归档是谁的"的唯一账本。改成复用
Write-BaknretAtomicText。
2) Write-BaknretAtomicText 原本也是走 Move-BaknretArchiveIntoPlace,而后者在 5.1 上
必然退化成"先删后移"(三参数 File.Move 是 .NET Core 3.0+ 才有的重载)。现在目标存在时
改用 File.Replace(ReplaceFile API):要么换成新内容、要么保持旧内容,两个都不会消失。
实测目标只读时替换失败、旧内容完好、.tmp 保留便于排查。
3) Move-BaknretArchiveIntoPlace 的 5.1 降级路径同样改成 File.Replace —— 之前那条
"先删后移"会在中途失败时让归档消失(旧归档没了、新归档还在 .tmp 里)。
注意第三个参数必须传 [NullString]::Value:PowerShell 会把 $null 转成空串,Replace 于是
报"路径为空"(两个版本实测都这样,我第一版就踩了)。
4) Get-FolderSummary 对空目录返回的 TotalSize 是 $null 而不是 0(Measure-Object 空
输入的行为,两版一致)。$null / 1GB 得 0,而备份前的空间守卫判的是 -gt 0 —— 空间不足时
不再拦截,静默失效。现在补成 0。
回归断言(零依赖与 Pester 各一份):空目录的摘要必须是整数 0;原子写成功时内容到位
且不留 .tmp、失败时旧内容完好(用只读目标强制失败)。
验收:test.ps1 9/9 全绿 —— 5.1 那一遍的通过同时证明了 File.Replace 这条新路径真的
在 5.1 上成立;tests\Run-RealSmoke.ps1 4/4 全绿。
2026-09-26 22:47:14 +08:00
..
2026-09-26 22:16:04 +08:00
2026-09-26 22:16:04 +08:00
2026-09-26 22:47:14 +08:00
2026-09-26 22:16:04 +08:00
2026-09-26 22:16:04 +08:00
2026-09-26 22:05:42 +08:00
2026-09-26 22:26:45 +08:00
2026-09-26 22:47:14 +08:00
2026-09-26 22:05:42 +08:00