Контейнер файлов C ++ (например, zip) для легкого доступа - PullRequest
5 голосов
/ 01 декабря 2010

У меня много маленьких файлов, которые мне нужно доставить вместе с приложением, которое я создаю, и я хочу поместить эти файлы в архив, чтобы было проще копировать и распространять их. Мне также очень нравится идея их хранения в одном месте, поэтому мне нужно сравнивать md5 одного файла только в случае, если что-то пойдет не так.

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

Я уже искал в Интернете различные способы достижения того, чего я хочу, и узнал о zlib и lzma sdk. И то, и другое мне не очень понравилось, потому что я не совсем понял, как работает zlib, и мне не понравился lzma sdk, поскольку он слишком большой, и я не хочу взрывать приложение из-за этой проблемы. , Другим недостатком zlib является то, что у меня нет опыта работы с C / C ++ (я действительно новичок в C ++), чтобы объяснить все в руководстве.

Я также должен добавить, что это проблема времени. Я некоторое время думал о реализации простого формата, такого как tar, таким образом, чтобы я мог легко получить доступ к файлам в моем приложении, но я просто еще не нашел время для этого.

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

Спасибо заранее, Robin.

Редактировать: мне нужно, чтобы архив был доступен в Linux и Windows. Извините, я не упомянул об этом в начале.

Ответы [ 6 ]

3 голосов
/ 01 декабря 2010

Для архивирования я всегда был неравнодушен к ZipUtils , что облегчает процесс и основывается на библиотеках zlib и info-zip.

2 голосов
/ 01 декабря 2010

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

Если вам не нужно изменять его, вы можете использовать TAR - это удобный и простой формат. Если вам нужно сжатие, вы можете реализовать tar.gz reader или найти какую-нибудь библиотеку, которая делает это (я думаю, что есть некоторые доступные, в том числе с открытым исходным кодом).

Если вашему приложению необходим произвольный доступ к данным или необходимо изменить архив, то обычные архивы TAR или ZIP не годятся. Виртуальная файловая система, такая как наша SolFS или файловая система CodeBase, подойдет гораздо лучше: виртуальные файловые системы подходят для частых модификаций хранилища, в то время как архивы предназначены главным образом для сценариев использования с однократной записью для чтения.

2 голосов
/ 01 декабря 2010

Если вы используете Qt или Windows, вы также можете упаковать данные в область ресурсов исполняемого файла. Вам нужно будет только распространить исполняемый файл, используя эту технику. Существует хорошо определенный API, уже написанный и протестированный для доступа к этим данным.

2 голосов
/ 01 декабря 2010

zlib очень портативен и очень широко используется.если вы не можете понять интерфейс C ++, есть альтернативы для многих других языков - см. «Связанные внешние ссылки» здесь .

Посмотрите еще раз, прежде чем искать что-то другое.

0 голосов
/ 06 августа 2012

Попробуйте использовать Quazip - это довольно просто в использовании.Вы можете использовать его как поток, из которого вы читаете сжатый файл на лету.

0 голосов
/ 01 декабря 2010

API zlib - это путь.Простой и портативный.Посмотрите заголовок unzip.h для API, которые обращаются к архивным файлам.Это в C и очень легко.

Если файлы небольшие, вы можете сбросить их в строковые литералы (поиск утилиты bin2h) и включить в ваш проект.Затем измените код, который читает файлы.Если все файлы в настоящее время читаются с использованием класса ifstream, просто измените его на класс istringstream и перекомпилируйте код.

...