2016-08-22 3 views
0

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

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

EDIT Кроме того, следующий код 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); 
+0

Вопросы, требующие рекомендаций, быстро отправляются на юг. Пожалуйста, обратитесь к разделу [help] (http://stackoverflow.com/help) о dos и don'ts here on SO. И упоминание JAVA и его libs не имеет никакого значения для вопроса, связанного с C++. –

+0

Это типичная проблема этого сообщества packexchange ... – jackb

+0

Не совсем. Мы все это пережили. Случилось также, когда я был новичком. Как только вы узнаете SO-пути, это легкий ветерок. –

ответ

3

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

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

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

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

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

+0

Спасибо.Кстати, таким образом я сжимаю только один файл за раз и не делаю ZIP-архив. Можно ли сделать то же самое для ZIP-архивов? – jackb

+1

@jackb Сам Zlib не может обрабатывать ZIP-архивы, но есть расширение в [contrib \ minizip] (https://github.com/madler/zlib/tree/master/contrib/minizip). – Nikita

+0

Спасибо, я постараюсь проверить это. Я редактирую свой вопрос, разъясняя, что я имею в виду zip-архивы. – jackb