Запись ZIP файла практически операция чтения наоборот:
- для каждого файла в архиве необходимо записать
LocalFileHeader
, затем содержимое файла, предварительно посчитав контрольную сумму - для каждой записи
LocalFileHeader
, записываемCentralDirectoryFileHeader
- записываем
EOCD
Теперь подробнее по пунктам
Запись Local File Header
Для каждого файла в архиве существуют две записи — это LocalFileHeader
и CentralDirectoryFileHeader
. При записи необходимо создавать эти структуры одновременно, только LocalFileHeader
записывать сразу, а для CentralDirectoryFileHeader
сохранять информацию во временный список для использования ее потом. Также для данных необходимо посчитать контрольную сумму с помощью функции crc32()
, которую предоставляет библиотека zlib
.
Запись Central directory file header
Используя данные, полученные на предыдущем шаге, записываем для каждого файла структуру типа CentralDirectoryFileHeader
. Предварительно необходимо сохранить смещение в файле для финальной записи EOCD
.
Запись EOCD
Самый простой этап — сформировать и записать структуру типа EOCD
.
Замечания по коду:
- ничего не раскрыто по поводу структуру
DataDescriptor
(ни разу не сталкивался) - иногда размер сжатых данных превышает размер несжатых, поэтому выделяйте память по науке (смотри документацию zlib)
- если размер данных очень большой, то придется воспользоваться структурой
DataDescriptor