Как устроен формат ZIP: как архив хранит информацию о файлах

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

Главный принцип, который стоит запомнить: данные и их описание в ZIP хранятся раздельно. Сначала идут сами файлы (каждый со своим заголовком), а в конце — единый центральный каталог со сводкой обо всём содержимом. Именно эта схема определяет поведение формата во всех сценариях — от восстановления до потоковой записи.

Общая структура архива

Архив ZIP состоит из трёх частей, расположенных последовательно:

  1. Локальные записи файлов. Для каждого файла: локальный заголовок, затем сжатые (или несжатые) данные этого файла.
  2. Центральный каталог. Список записей о всех файлах: имя, размер, метод сжатия, контрольные суммы, смещения до локальных заголовков.
  3. Конечная запись каталога (End of Central Directory). Небольшой блок в самом конце файла, который указывает, где начинается каталог и сколько в нём записей.

Программа открывает архив «с конца»: находит конечную запись, по ней — каталог, а уже через каталог переходит к нужным файлам. Такая организация позволяет перечислить содержимое архива мгновенно, даже если он весит десятки гигабайт: читать весь файл целиком для просмотра списка не требуется.

Локальный заголовок файла

Перед данными каждого файла стоит свой заголовок фиксированной структуры. В нём записаны:

  • сигнатура начала записи — специальная последовательность байтов, по которой программы опознают файл внутри потока данных;
  • версия формата, необходимая для распаковки;
  • флаги: например, признак шифрования или использования UTF-8 для имени файла;
  • метод сжатия;
  • время и дата изменения файла;
  • контрольные суммы CRC-32 для исходных и сжатых данных;
  • размеры: исходный, сжатый;
  • имя файла и его длина;
  • необязательное поле дополнительных атрибутов.

Сразу после заголовка идут сами данные файла в выбранном формате сжатия. Затем начинается запись следующего файла — и так до конца списка.

Центральный каталог

После всех файлов размещается центральный каталог. Каждая его запись повторяет ключевую информацию локального заголовка и добавляет важную деталь — смещение: сколько байтов от начала архива до локального заголовка соответствующего файла. Благодаря этому архиватор может прыгнуть прямо к нужному файлу, не просматривая предыдущие.

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

Что именно сохраняется о каждом файле

Метаданные в ZIP намеренно минимальны. Формат создавался в эпоху DOS, поэтому базовый набор полей скромный:

  • Имя и путь. Хранится как текстовая строка; вложенность папок передаётся через разделители в самом имени.
  • Дата и время изменения. Базовый формат хранит их с точностью до двух секунд, что заметно грубее современных файловых систем.
  • Размеры до и после сжатия. Позволяют проверить целостность и оценить эффективность упаковки.
  • CRC-32. Контрольная сумма исходного содержимого: при распаковке она пересчитывается и сравнивается. Несовпадение означает повреждение данных.
  • Метод сжатия. Указывает, каким алгоритмом упакованы данные.
  • Атрибуты платформы. Права чтения/записи/исполнения, признак каталога. Полнота этих сведений зависит от системы, в которой создан архив.

Чего в классическом ZIP нет: владельца файла, точных временных меток с долями секунды, жёстких и символических ссылок (есть лишь расширения у отдельных реализаций), списков контроля доступа. Поэтому архив, созданный в Linux и распакованный в Windows, почти всегда теряет часть атрибутов — это ограничение самого формата, а не конкретной программы.

Методы сжатия

Каждый файл в архиве сжимается независимо, своим методом. Исторически в спецификации закреплено несколько вариантов:

Метод Суть Где применяется
Store Без сжатия, данные копируются как есть Уже сжатые файлы: видео, изображения JPEG, архивы внутри архива
Deflate Комбинация словаря повторов и кодирования Хаффмана Основной и самый распространённый метод
Deflate64 Расширенная версия Deflate с большим окном Редко, поддержка ограничена
BZip2 Блочная сортировка с хорошим сжатием текста Некоторые архиваторы по выбору пользователя
LZMA Сильное сжатие с большим словарём Современные реализации, даёт меньший размер ценой скорости
AES-шифрованные данные Не метод сжатия, но отдельная обработка содержимого Защищённые архивы

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

Почему независимое сжатие — это и сила, и слабость

В ZIP каждый файл обрабатывается отдельно, со сбросом словаря сжатия между файлами. Это даёт важные преимущества:

  • Выборочное извлечение. Можно достать один файл, прочитав только его фрагмент архива.
  • Частичное восстановление. Повреждение середины архива обычно разрушает один-два файла, а остальные остаются читаемыми.
  • Потоковая запись. Архив можно дописывать и создавать «на лету», не зная заранее полного списка файлов.

Обратная сторона — потеря эффективности на множестве похожих мелких файлов. Тысяча однотипных документов сожмётся хуже, чем если бы они обрабатывались одним непрерывным потоком с общим словарём. Форматы вроде 7z используют сплошное сжатие (solid) именно ради этого, жертвуя выборочным доступом. Для большого количества мелких файлов ZIP часто проигрывает по размеру — это ожидаемое поведение, а не дефект архиватора.

Целостность и восстановление

CRC-32 в каждой записи работает так: при создании архива считается сумма исходного файла, при извлечении — сумма распакованных данных. Расхождение сигнализирует о повреждении. Важно понимать ограничения этой проверки:

  • CRC-32 защищает от случайных искажений, но не является криптографической проверкой: подменить содержимое с сохранением суммы технически возможно.
  • Проверка происходит при распаковке. Пока файл не извлечён, испорченные данные могут оставаться незамеченными.
  • Если повреждён центральный каталог, многие программы отказываются открывать архив целиком, хотя данные файлов физически целы. Инструменты восстановления умеют сканировать архив по сигнатурам локальных заголовков и собирать файлы напрямую — отсюда типичная ситуация, когда «битый» ZIP удаётся спасти частично.

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

Шифрование и защита

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

  • шифрование в ZIP обычно покрывает содержимое файлов, но имена файлов в центральном каталоге могут оставаться открытыми — список того, что лежит в архиве, виден без пароля, если не включена защита имён;
  • совместимость зависит от программ: архив с AES, созданный одним инструментом, может не открыться устаревшим распаковщиком;
  • надёжность защиты определяется паролем: короткий или предсказуемый пароль обесценивает любой алгоритм.

Ограничения формата, о которых полезно знать

  • Кодировки имён. Старые версии формата предполагали одну кодировку для имён файлов, из-за чего архивы с русскими именами, созданные в одной системе, в другой распаковывались с «кракозябрами». Современные реализации помечают имена флагом UTF-8, но старые архивы проблема по-прежнему затрагивает.
  • Ограничение размера. Классический ZIP поддерживает файлы до 4 ГБ и архивы до 4 ГБ. Расширение ZIP64 снимает этот предел, но требует поддержки со стороны обеих программ — создания и распаковки.
  • Точность времени. Двухсекундная точность метаданных недостаточна для задач синхронизации и резервного копирования, где важны доли секунды.
  • Нет встроенного восстановления. В отличие от некоторых форматов, в ZIP нет избыточных данных для самостоятельного ремонта; восстановление возможно только за счёт независимости записей.

Практические сценарии: когда ZIP подходит, а когда нет

Когда ZIP — разумный выбор

  • Обмен наборами файлов между разными операционными системами: формат поддерживается везде «из коробки».
  • Упаковка смешанного содержимого, где важен быстрый доступ к отдельным файлам без полной распаковки.
  • Передача данных, которые получатель должен открыть без установки дополнительного ПО.

Когда лучше рассмотреть альтернативы

  • Максимальное сжатие больших объёмов: LZMA в 7z или специализированные форматы обычно дают меньший размер.
  • Резервное копирование с сохранением всех атрибутов Unix-систем: tar с последующим сжатием сохраняет метаданные полнее.
  • Долговременное хранение с требованием целостности: форматы с избыточностью восстановления надёжнее против порчи носителя.

Частые ошибки при работе с архивами

  • Повторное сжатие уже сжатого. Архивирование ZIP-архива или JPEG-файлов почти не уменьшает размер, но тратит время. Проверьте тип содержимого перед выбором режима.
  • Надежда на пароль вместо проверки совместимости. Защищённый AES-архив бесполезен, если у получателя программа его не читает. Уточните формат шифрования заранее.
  • Хранение единственной копии. Повреждение носителя уничтожает архив безвозвратно; CRC поможет лишь обнаружить проблему, но не исправить её.
  • Игнорирование предупреждений при распаковке. Сообщение о несовпадении контрольной суммы означает, что файл уже испорчен — продолжать использовать его нельзя.
  • Дописывание в рабочий архив. Если процесс добавления файлов прервётся (например, отключением питания), каталог может остаться некорректным. Для важных данных безопаснее собирать новый архив целиком.

Что делать дальше

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

Материал носит информационный характер. Конкретные возможности формата зависят от версии спецификации и используемых программ: перед работой с важными данными уточняйте параметры поддержки в документации вашего архиватора.

PEFile.ru