Создание сжатого файла в C++ без знания начального размера файла

Я использовал стандартную библиотеку Java для записи файлов Zip Archive, и в этом случае мне не нужно заранее знать, какие файлы будут сохраняться в zip файле: я просто создал бы новый ZipEntry и затем записал в поток ZipFile.

С другой стороны, LibArchive и ZLib для C++ должны заранее установить информацию о файле, подлежащем архивации: в моем случае данные, которые я хочу сжать, поступают из внешнего потока, и, следовательно, я не могу запросить размер самого потока, Существует ли библиотека / способ использования этих библиотек, чтобы информация о начальном файле не требовалась?

РЕДАКТИРОВАТЬ Кроме того, следующий код C++ с LibArchive создает действительный ZIP-файл, содержащий файл без данных.

    a = archive_write_new();
    archive_write_add_filter_gzip(a);
    archive_write_set_format_pax_restricted(a); 
    archive_write_open_filename(a, path.c_str());
    entry = archive_entry_new(); // Note 2
    archive_entry_set_pathname(entry, entryName.c_str());
    archive_entry_set_perm(entry, 0666);
    archive_write_header(a, entry);
    size_t s = archive_write_data(a, buff, len);
    archive_entry_free(entry);
    archive_write_close(a);
    archive_write_free(a);

1 ответ

Проверьте образец на официальном сайте Zlib. В примерах байты из исходного файла сжаты в новый файл до EOF в исходном файле. Размер файла исходного файла не используется.

Единственное, что вы должны изменить в образце, чтобы использовать свой собственный поток, это строка:

strm.avail_in = fread(in, 1, CHUNK, source);

Используйте вашу функцию, чтобы получить байты из потока для заполнения in буфер.

Для обработки ZIP-архива в Zlib используйте contrib / minizip. Вот обсуждение того, как его использовать.

Другие вопросы по тегам