Helionix

Как восстановить центральный каталог ZIP

Устройство локальных заголовков, центрального каталога, EOCD и ZIP64: как найти сохранившиеся записи, проверить границы и перестроить индекс в новом ZIP.

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

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

Как устроена структура ZIP

Перед данными каждого файла располагается локальный заголовок. В конце собраны соответствующие заголовки центрального каталога, а завершает структуру запись End of Central Directory. Для ZIP64 используются дополнительные записи и локатор. По спецификации локальный и центральный заголовок должны соответствовать одной записи, но при потоковом создании размеры и CRC иногда размещаются в data descriptor после данных.

ЧастьРольЧто происходит при повреждении
Локальный заголовокОписывает следующую записьКонкретный файл трудно распознать или прочитать
Сжатые данныеСодержат байты файлаВозникает ошибка декодирования или CRC
Центральный каталогИндексирует все элементыАрхив может не открываться как единое дерево
EOCDПоказывает параметры и положение каталогаПриложение сообщает, что конец каталога не найден

Как выполняется реконструкция

  1. Создаётся копия исходного файла.
  2. Проверяется наличие EOCD и ZIP64-служебных записей.
  3. Если штатный каталог недоступен, сканируются локальные заголовки.
  4. Для каждой кандидатной записи проверяются границы и метод.
  5. Данные декодируются, а CRC пересчитывается.
  6. Подтверждённые элементы записываются в новый ZIP.
  7. Для нового контейнера формируется новый центральный каталог.

Запустить эту процедуру можно через восстановление каталога ZIP. Исходный файл при этом должен оставаться неизменным.

Почему простой поиск сигнатуры недостаточен

Последовательность байтов, похожая на подпись локального заголовка, может случайно встретиться внутри сжатого или зашифрованного потока. Поэтому найденный кандидат нельзя сразу считать файлом. Нужно проверить длины полей, допустимость метода, границы контейнера и успешность декодирования. Достоверность повышает совпадение CRC.

Что может не восстановиться

Если использован data descriptor без доступного каталога, определить точную границу сжатого потока сложнее. Зашифрованные заголовки скрывают структуру. При обрыве последняя запись может быть неполной. Комментарии, исходный порядок, внешние атрибуты и некоторые дополнительные поля также могут быть утрачены, даже если содержимое файлов удалось спасти.

ZIP64 и большие файлы

ZIP64 хранит расширенные размеры и смещения в дополнительных полях и отдельных конечных записях. Нельзя интерпретировать специальные 32-битные значения как реальные размеры. Инструмент восстановления должен понимать ZIP64, иначе большой исправный архив будет ошибочно признан повреждённым или запись получит неверные границы.

Как проверить перестроенный архив

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

Какие метаданные нельзя угадать

Локальный заголовок содержит не всё, что находилось в центральном каталоге. При его утрате могут исчезнуть комментарий записи, часть внешних атрибутов, сведения о платформе и точное исходное положение в списке. Восстановитель не должен выдумывать значения: безопаснее применить нейтральные атрибуты, сохранить найденное имя и перечислить потери в отчёте. Для исполняемых Unix-файлов утрата прав важна — после спасения их нужно восстановить по доверенному манифесту или документации проекта.

Частые вопросы

Можно ли вернуть исходные имена?

Если локальные заголовки сохранились и имена не были скрыты, обычно да. При повреждении поля или кодировки может потребоваться безопасное техническое имя.

Восстановится ли комментарий архива?

Комментарий расположен в конечной записи и при обрезанном конце часто теряется. Он не влияет на содержимое файлов.

Почему новый ZIP меньше исходного?

В него вошли только подтверждённые записи, а также могли измениться метод упаковки и метаданные. Сравнивайте список и исходные размеры, а не только объём контейнера.

Итог

Реконструкция каталога возможна, когда локальные заголовки и соответствующие данные сохранились. Надёжный алгоритм проверяет границы, декодирует записи, пересчитывает CRC и создаёт новый ZIP, не выдавая найденные по сигнатуре фрагменты за гарантированно целые файлы.

Попробовать восстановить каталог ZIP →