Как мне заархивировать каталог или несколько файлов с помощью zlib, используя C / C ++? - PullRequest
2 голосов
/ 01 декабря 2011

Я выполнил поиск по этой теме, но я не нашел соответствующей подсказки для этого.

Кто-нибудь может дать мне несколько советов или демонстрационный код, который может решить проблему?

Заранее спасибо.

--- К вашему сведению ---

То, что я хочу здесь сделать, - это заархивировать файлы и загрузить их на удаленный компьютер.Я думаю, что он предпримет следующие шаги:

a) инициализирует заархивированную головку файла и отправляет на удаленный ПК и сохраняет эту заархивированную головку файла.

b) открывает файл для чтениячасть данных файла и локально заархивируйте данные файла.

c) отправьте сжатые данные через канал (например, tcp или udp) на удаленный ПК.

d) сохраните данные из канала, который заархивирован на удаленном ПК.

e) если имеется несколько файлов, вернитесь к b)

e) когда все файлы будут сжаты и переданы на удаленный ПК, затем закройтеzip-файл.

Два вопроса здесь:

a) сжатие / распаковка

b) Формат файла

Спасибо, ребята!

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

zlib архивирует один поток.Если вы хотите сжать несколько файлов, вам нужно сделать одну из двух вещей:

  • Определить формат (или использовать существующий формат), который объединяет несколько файлов в один поток, а затем сжать это;или
  • Сжатие каждого файла по отдельности, затем используйте некоторый формат для объединения этих файлов в один выходной файл.

Если вы выберете первый вариант, используйте существующий формат tar для объединенияфайлы, вы будете производить файл .tar.Z, который можно извлечь с помощью стандартных инструментов, так что это хороший способ.Вы можете использовать libtar для создания архива tar.

3 голосов
/ 26 июля 2015

Я построил оболочку вокруг минизипа, добавив в нее некоторые необходимые функции и сделав ее более удобной для использования. Использует ли последний C ++ 11 и разработан с использованием Visual Studio 2013 (должен быть переносимым, но я не тестировал его на Unix)

Здесь есть полное описание: https://github.com/sebastiandev/zipper

но так просто, как вы можете получить:

Zipper zipper("ziptest.zip");
zipper.add("somefile.txt");
zipper.add("myFolder");
zipper.close();

Вы можете заархивировать целые папки, потоки, векторы и т. Д. Также хорошая функция - делать все полностью в памяти.

...