Как сделать zip каталог файлов с помощью C++?

Я работаю над проектом, использующим C++, Boost и Qt. Я понимаю, как сжимать отдельные файлы и bytestreams, используя, например, функцию qCompress() в Qt.

Как сделать zip каталог из нескольких файлов, включая подкаталоги? Я ищу кросс-платформенное (Mac, Win, Linux) решение; я бы предпочел не запускать кучу новых процессов.

есть ли стандартный способ объединить bytestreams из нескольких файлов в zip-архив, или, может быть, там является ли функция или метод удобства, которые будут доступны в библиотеке Boost iostream?

большое спасибо за помощь.

обновление: библиотека QuaZip выглядит действительно здорово. В пакете загрузки (в директории "тесты") есть пример, который очень четко показывает, как zip вверх каталог файлов.

обновление 2: после выполнения этой задачи в моей среде сборки Linux я обнаружил, что QuaZip вообще не работает с компилятор Visual Studio. Возможно, можно решить все эти ошибки компилятора, но слово предостережения для тех, кто смотрит на этот путь.

6 ответов


Я нашел следующие две библиотеки:

  • ZipIOS++. Кажется, это "чистый" C++. Они не перечисляют Windows явно как поддерживаемую платформу. Так что, думаю, тебе стоит попытать счастья самому.
  • QuaZIP. На основе Qt4. Вообще - то выглядит неплохо. Они явно перечисляют окна (используя mingw). По-видимому, это оболочка C++ для [этой] библиотеки.

ах, и, конечно, я сорвал эти сайты с этой Qt Mailinglist вопрос о Молнии/распаковке каталогов:)



просто для протокола...

сегодня мне нужно было сделать что-то очень похожее на Visual C++. (Хотя хотел сохранить возможность компиляции проекта на других платформах; однако предпочел не принимать Qt только для этой цели.)

в конечном итоге с помощью Minizip библиотека. Он написан на простом C, но разработка простой оболочки C++ вокруг него была ветром, и конечный результат отлично работает, по крайней мере, для моих целей.


Я попробовал QuaZIP 0.4.3 в Windows с VisualStudio 2010 - есть еще проблемы, но их можно легко решить.

построить с VS:

  1. используйте CMake для настройки и генерации решения VS для QuaZIP.
  2. открыть soltion с VS и build - вы сначала заметите, что он не может найти 'zlib.h'.
  3. Откройте настройки для проекта quazip и добавьте путь к копии zlib Qt на C/C++ - >общие - >дополнительные каталоги Include: $(QTDIR)/src/3rdparty / zlib.
  4. перестроить снова, и вы получите много предупреждений и одну ошибку c2491: DllImport статическая проблема на QuaZipFile::staticMetaObject.
  5. это потому, что QuaZipFile объявлен как "класс QUAZIP_EXPORT QuaZipFile", и QUAZIP_EXPORT должен разрешить Q_DECL_EXPORT для dll и Q_DECL_IMPORT для приложения, на основе того, определен ли QUAZIP_BUILD или нет. При построении QuaZIP QUAZIP_BUILD должен быть определен, но не является -- configuration process вместо этого определяет по ошибке совершенно бесполезный "quazip_EXPORTS".
  6. чтобы исправить, просто удалите "quazip_EXPORTS" из всех конфигураций сборки и добавьте QUAZIP_BUILD вместо этого -- QuaZIP теперь будет строить нормально.

Я построил обертку вокруг minizip, добавив некоторые функции, которые мне нужны, и сделав его приятнее использовать. Is использует последнюю версию c++11 и разработан с использованием Visual Studio 2013, поэтому он должен работать из коробки для вас.

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

вы можете архивировать целые папки, потоки, векторы и т. д. Кроме того, хорошая функция делает все полностью в памяти.


system("zip myarchive.zip *");