Выбор товаров
📝

Проверка восстановления ZIP: как найти повреждение при одинаковом числе файлов

Опыт редакции с 8 искусственными файлами: восстановление ZIP, пропущенный файл и изменение без смены размера. CSV и скрипт для безопасного повторения.

Проверка восстановления ZIP: как найти повреждение при одинаковом числе файлов

Наличие ZIP в папке резервных копий и успешная распаковка ещё не доказывают совпадение содержимого с оригиналом. Сравните относительный путь, размер в байтах и SHA256 восстановленного файла с исходной записью. SHA256 — длинный отпечаток, вычисляемый по содержимому. Он помогает найти изменение даже при прежних имени и размере.

Задача статьи — провести небольшую пробу восстановления без перезаписи оригинала и отличить пропуск от изменения содержимого в таблице результатов. Редакция MillionsCode создала 8 искусственных файлов, действительно упаковала и восстановила их. Затем намеренно внесла две ошибки, чтобы проверить обнаружение различий. Материалы клиентов и личные резервные копии не использовались.

Что измерили на 8 файлах

Испытание выполнено 28 сентября 2026 года в Windows с PowerShell 7.6.0-rc.1 и Microsoft.PowerShell.Archive 1.2.5. Совместимость нескольких стабильных версий не сравнивалась. Набор включал пустой файл, корейское имя с пробелами, два разных файла по 4 байта, одноимённые файлы в разных вложенных папках, двоичный файл на 256 байт и текстовую памятку. Всего 8 файлов, 372 байта.

Сначала составили список оригиналов. Для каждого сохранили относительный путь от папки испытания, например nested/level2/sample.txt, размер и SHA256. Затем упаковали папку в ZIP и распаковали в новую папку. Сравнили размер и отпечаток файлов с одинаковым относительным путём. Одних имён недостаточно: два sample.txt в разных папках можно перепутать.

УсловиеОригиналовПроверяемых файловСовпалоРазличие
Обычное восстановление ZIP в новую папку888Нет
При повторном копировании восстановленного набора намеренно пропущен файл877Нет вложенного файла на 15 байт
В отдельном восстановленном наборе AAAA заменено на ZZZZ887Не совпал SHA256 файла на 4 байта

Первый опыт проверяет нормальный путь. Два остальных — контрольные пробы: должна ли проверка сообщить об ошибке после её намеренного внесения. Это не доказательство потери или повреждения файлов 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-a.txt в опыте same_size_change оба размера равны 4. Но исходный отпечаток начинается с 63C1DD95…, изменённый — с 96741164…. Сравнивались все 64 символа, а не только начало. Файл empty.txt изначально имел 0 байт; после нормального восстановления его отпечаток совпал. Правило «0 байт — повреждение» ошибочно отбракует намеренно пустые файлы.

Безопасное повторение до работы со своими данными

Прочитайте исходный скрипт и сохраните его в учебную папку как restore-lab.ps1. Убедитесь, что расширение не осталось .ps1.txt. Скрипт не принимает пути к пользовательским данным. При каждом запуске создаёт новую папку рядом с собой и упаковывает, восстанавливает и изменяет только собственные искусственные файлы. Команд удаления оригиналов и принудительной перезаписи существующих восстановленных файлов в нём нет. Положите скрипт в пустую учебную папку, прочитайте и выполните в PowerShell. Если корпоративная политика запрещает скрипты, не отключайте её самостоятельно: ниже можно изучить ручную последовательность.

# Выполнить в учебной папке, где сохранён restore-lab.ps1
& '.\restore-lab.ps1'

Ожидаемый результат: zip_restore — PASS, две намеренные ошибки — FAIL. Значение True во всех трёх строках ControlBehavedAsExpected означает, что проверка нормально отреагировала на эти нормальное и ошибочные условия. Не путайте 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 объясняет сравнение содержимого и SHA256 по умолчанию в Get-FileHash. В Expand-Archive различаются путь назначения и параметр перезаписи. В примере нет -Force, перезаписывающего существующие файлы.

Что остаётся непроверенным даже после PASS

Q. Значит ли PASS, что весь резервный архив безопасен?

Здесь PASS означает совпадение путей, размеров и содержимого 8 искусственных файлов после восстановления. Не измерялись скорость SSD, срок службы диска, успешность облачной синхронизации или надёжность больших архивов. Использовалась одна среда; права, владельцы, ключи шифрования, настройки приложений и открытые базы данных не испытывались. Таблицы и фотографии нужно отдельно открыть в нужной программе; для рабочей программы проверить также возвращение связанных данных.

Q. Подходит ли способ для скрытых и больших файлов?

В документации Compress-Archive указано, что скрытые файлы и папки могут пропускаться и есть ограничение размера файла. Не распространяйте этот маленький ZIP-пример на резервирование всей ОС и скрытых настроек. В наборе не было скрытых файлов и файлов размером 2 ГБ или больше.

Q. Одинакового отпечатка достаточно?

Если сам исходный список ошибочен или изменён вместе с файлами, совпадение отпечатков не доказывает подлинность оригинала. Проверьте отдельно сохранённый список и время его создания. При пропуске или несовпадении восстановите нужный путь ещё раз до удаления оригинала. После проверки списка и отпечатков откройте нужные документы. Это даёт более конкретный план восстановления, чем одно наличие ZIP.

Похожее