产品选择
📝

检查备份ZIP恢复:文件数量相同也可能漏掉内容变化

实际压缩并恢复八个合成文件,再主动加入缺失与等长内容修改,观察比较器能否发现。本文说明相对路径、字节大小及完整SHA256的核对方法,提供二十四行逐文件结果与复现脚本,并划清这项小型试验没有验证的大文件、权限和应用恢复范围。

检查备份ZIP恢复:文件数量相同也可能漏掉内容变化

备份文件夹里有ZIP,解压也完成了,内容就一定与原件相同吗?需要把恢复文件的相对路径、字节大小和SHA256与原始记录逐一比较。SHA256是从内容计算出的长指纹。即使名称和大小不变,内容变化也能通过指纹差异被发现。

本文不是选择备份软件,而是做一次不覆盖原件的小型恢复试验,并从结果表区分文件缺失与内容改变。MillionsCode编辑部创建了8个合成文件,实际压缩和恢复,随后故意加入两类错误,检查比较器能否发现。没有使用真实客户资料或个人备份。

8个文件的实测与方法

试验于2026年9月28日在Windows上运行,使用PowerShell 7.6.0-rc.1和Microsoft.PowerShell.Archive 1.2.5。这不是多个稳定版本之间的兼容性测试。数据包括0字节文件、带空格的韩文文件名、两个各4字节但内容不同的文件、位于不同子文件夹的同名文件、256字节二进制文件和说明文档。共8个文件、372字节。

先建立原始清单。用nested/level2/sample.txt这样的相对路径记录从试验文件夹起的位置,并保存每个文件的大小与SHA256。将文件夹压缩为ZIP,在新文件夹解压,再按相同相对路径比较大小与指纹。只按文件名比较,会混淆不同文件夹中的两个sample.txt。

试验条件原始文件数比较文件数一致数检出的差异
ZIP正常恢复到新文件夹888无
再次复制恢复文件时故意漏掉一个877嵌套文件夹中15字节文件缺失
在另一份恢复副本中把AAAA改为ZZZZ8874字节文件的SHA256不一致

第一个是正常路径,后两个是故意注入错误、检查是否显示失败的对照试验。它们不表示ZIP工具丢失或损坏了文件。缺失由编辑部在复制阶段加入,内容修改发生在解压后的独立副本中。

第三个尤其有用:两边都是8个文件,修改文件前后均为4字节。仅检查文件夹大小或数量可能通过,但指纹比较找出了那个不同文件。数量和大小是快速检查项,内容一致是另一层检查。

如何阅读结果CSV

restore-summary.csv汇总三个试验。restore-comparison.csv含24行逐文件记录。Case是试验名,RelativePath是文件夹内位置。ExpectedBytes与ActualBytes分别为原始和比较文件大小,两列SHA256是内容指纹。技术英文列名及韩文文件名保留实测原样。

  • MATCH:该相对路径的大小与内容指纹都一致。
  • MISSING:原始清单中的路径在比较副本中不存在。实际大小空白表示没有文件,不是0字节。
  • HASH_MISMATCH:大小相同,但内容指纹不同,应再次恢复该文件确认。
  • 脚本还把大小不同标为SIZE_MISMATCH,把原始清单外的文件标为UNEXPECTED。本次三个试验没有分别为这两个分支注入错误验证。

例如same_size_change中的same-a.txt,两边大小都是4。原始指纹以63C1DD95…开头,修改后以96741164…开头。实际比较使用完整64位字符,不只比较前缀。empty.txt本来就是0字节,正常恢复后指纹也一致。把所有0字节文件都当作损坏,会误判有意留空的文件。

用自己的资料前,先安全复现

先阅读复现脚本原文,在练习文件夹中保存为restore-lab.ps1,确认扩展名没有仍是.ps1.txt。复现脚本不接收用户文件路径。每次运行都在脚本所在位置下新建试验文件夹,只压缩、恢复和修改自己生成的文件,没有删除原始文件的命令或强制覆盖旧恢复副本的选项。先把脚本放在空练习文件夹,读过内容再用PowerShell运行。如果公司政策禁止脚本,不要自行解除限制,也可以按照下方手动流程理解结果。

# 在保存restore-lab.ps1的练习文件夹中运行
& '.\restore-lab.ps1'

zip_restore应为PASS,两个故意错误案例应为FAIL。最后的ControlBehavedAsExpected三行均为True,才表示在这次正常与错误条件下,检查结果符合预期。不要把对照试验的FAIL当成正常备份失败。结束后,在屏幕显示的新文件夹中打开CSV与results.json,核对执行时间、版本和完整指纹。

检查自己的备份时,应使用创建压缩包当时的原始清单。与后来修改过的当前文件比较,正常历史备份也可能不一致。先用重要文件的副本练习,恢复目标选择没有现有资料的新文件夹,不要把原始位置当作解压目标。

核心命令如下。路径只是示例,应只在练习文件夹内替换使用。第一条压缩练习原件,第二条把ZIP恢复到新位置,后两条显示对应文件指纹。恢复目录多出一层source,是因为压缩时包含了文件夹本身。

Compress-Archive -LiteralPath '.\source' -DestinationPath '.\trial.zip'
Expand-Archive -LiteralPath '.\trial.zip' -DestinationPath '.\restore-new'
Get-FileHash -LiteralPath '.\source\notes.txt' -Algorithm SHA256
Get-FileHash -LiteralPath '.\restore-new\source\notes.txt' -Algorithm SHA256

Microsoft的Get-FileHash文档说明内容指纹比较及默认SHA256。Expand-Archive文档区分目标路径与覆盖选项。本例不使用-Force覆盖现有文件。

通过后仍未检查的内容

Q. 通过就代表整个备份安全吗?

这里的PASS只代表8个合成文件恢复后的位置、大小和内容一致。没有测量SSD速度、硬盘寿命、云同步成功率或大规模备份可靠性。只在一个环境运行,也没有测试权限、所有者、加密密钥、应用设置或打开中的数据库。电子表格和照片能否在应用中打开、业务软件依赖的关联资料能否恢复,应另行检查。

Q. 隐藏文件和大文件也能照此处理吗?

Microsoft的Compress-Archive文档说明可能跳过隐藏文件和文件夹,并存在文件大小限制。不要把这个小型ZIP示例扩大为保存整个操作系统或隐藏设置的方法。本次原始数据没有隐藏文件或2GB以上文件。

Q. 指纹与原始文件相同,验证就结束了吗?

如果基准清单本身错误,或与文件同时被篡改,仅有指纹一致无法证明是真正原件。核对单独保管的基准清单及创建时间;若有缺失或不一致,删除原件前再次恢复相应路径。清单与指纹通过后,再实际打开需要的文档,才能比“ZIP存在”更具体地决定下一步恢复行动。

相关