LINUX.ORG.RU

C, cоздать zip в памяти, без записи на диск

 ,


0

3

Вечер добрый! Пишу небольшую программку под embedded железку, понадобилось в ходе её работы создавать зип файл для дальнейших преобразований. Собственно, нашёл libzip, однако не могу понять, как получить результат без записи на диск. Сперва меня подорвало от отсутствия адекватных примеров (я обычный пользователь, не программист, копаться в сорцах желания нет), затем нашёл небольшой пример как создавать zip и записывать его на диск. Также видел другой пример, многообещающе называющийся in-memory.c, но фактически бесполезный в моём случае - там происходит модификация зипа, который уже находится в памяти. Пошерстил сорцы libzip, но не нашёл ни одной функции или набора функций, которые бы решали мою задачу.

Прошу помощи, да-да-да.

Ответ на: комментарий от vvviperrr

Дядь, я умею сжимать данные зулибом. Мне нужно создавать zip архив с файлами. В zlib/contrib/minizip есть пример того, как создавать zip файл, но для этого нужно рипнуть и модифицировать код (ибо весь функционал там в main'е), а я не хочу городить велосипеды, я хочу чтобы в 2017-ом году, когда космические корабли бороздят просторы вселенной, я мог подключить библиотеку, вызвать пару-тройку функций и решить свою задачу.

antonkoramislin2001 ()
Ответ на: комментарий от xaizek

Да, эта функция используется, чтобы парсить зип из памяти.

Я пока пришёл к такому кодесу

zip_error_t zipError;
zip_source_t *zipSrc;
zip_t* zipZip;

...

zip_error_init(&zipError);
zipZip = _zip_new(&zipError);
fprintf(stderr, "Creating source buffer\n");
zipSrc = zip_source_buffer_create(sContent, iContentSize, 1, &zipError);
if (zipSrc == 0) {
    fprintf(stderr, "Can't create zip source buffer\n");
    return;
}
fprintf(stderr, "Adding file\n");
zip_add(zipZip, "wowwhatafile.txt", zipSrc);
zip_close(zipZip); // ловим сегфолт

осталось понять, как указать настройки сжатия и как сцапать зип прямиком из памяти.

antonkoramislin2001 ()
Ответ на: комментарий от antonkoramislin2001

zip_close(zipZip); // ловим сегфолт

sContent

«s» это «static»? Тогда нельзя разрешать его удалять (третий параметр zip_source_buffer_create) и вообще оттуда же данные и надо будет читать, если размер удасться узнать как-нибудь. Я не нахожу так сходу в API.

Настройки сжатия это видимо zip_set_file_compression().

Вообще мне не нравится, что в мане написано только про чтение из источника, но не запись в него. Может оно не умеет писать в память.

xaizek ★★★★★ ()
Ответ на: комментарий от samson

Да, забыл про tmpfs написать - мне памяти не хватает в момент чтения (он ведь дублируется - один лежит на tmpfs, другой в адресном пространстве моей программы).

antonkoramislin2001 ()
Ответ на: комментарий от xaizek

Нет, s значит string (ну, как я же не программер, потому извращаюсь в своих исходах как хочу). Просто unsigned char*.

antonkoramislin2001 ()
Ответ на: комментарий от antonkoramislin2001

В смысле, не хватает памяти, чтоб прочитать получившийся архив? Возможно, mmap(2) придёт на помощь - отображение файла в память обходится почти бесплатно.

Laz ★★★★★ ()
Последнее исправление: Laz (всего исправлений: 1)

Может, Go подойдёт, если железка не совсем хардкорная. В Go это делается легко и просто.

anonymous ()
Ответ на: комментарий от DELIRIUM

Да, забыл про tmpfs написать - мне памяти не хватает в момент чтения

ТС, вроде это писал. Ну да пускай сам отвечает.

Twissel ★★★★★ ()

Тэкс, а подскажите, как libzip кросскомпильнуть? С кросскомпиляцией прог, использующих стандартное

configure make install
проблем нет.
СС=blahblah cmake .
не помогает, всё равно создаётся статическая либа архитектуры хоста.

antonkoramislin2001 ()
Ответ на: комментарий от Twissel

Да не заметил это его сообщение. Но если для tmpfs ему не хватает памяти, с чего он взял, что её впринципе хватит для его задачи?

DELIRIUM ☆☆☆☆☆ ()

zip умеет читать и писать из stdin/stdout, следовательно запускайте через pipe, память тогда у вас скушается не на файл, так как будете работать только с буфером, а на два работающих процесса :)

vodz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.