Проверка восстановления ZIP: как найти повреждение при одинаковом числе файлов
Опыт редакции с 8 искусственными файлами: восстановление ZIP, пропущенный файл и изменение без смены размера. CSV и скрипт для безопасного повторения.
Наличие 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 в новую папку | 8 | 8 | 8 | Нет |
| При повторном копировании восстановленного набора намеренно пропущен файл | 8 | 7 | 7 | Нет вложенного файла на 15 байт |
В отдельном восстановленном наборе AAAA заменено на ZZZZ | 8 | 8 | 7 | Не совпал 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.
Похожее
Разделите скорость соединения и файлов. Рассчитайте время для 100 GB, проверьте ...
Выбор товаровКлавиатура для программирования: проверка раскладки, шума и связиСравните сочетания клавиш, набор, шум, выход из сна и настройки в одинаковых усл...