簡體   English   中英

在不知道初始文件大小的情況下用C ++創建壓縮文件

[英]Creating compressed file in C++ without knowing the initial file size

我一直在使用Java的標准庫來編寫Zip存檔文件,在這種情況下,我不必事先知道將要存儲到zip文件中的文件:我只需創建一個新的ZipEntry然后寫入ZipFile流。

另一方面,C ++的LibArchive和ZLib必須預先設置要存檔的文件信息:在我的情況下,我要壓縮的數據來自外部流,因此我無法查詢流本身的大小。 是否存在使用這些庫的庫/方式,從而不需要初始文件信息?

編輯此外,使用LibArchive的以下C ++代碼將生成一個有效的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);

Zlib官方網站上查看示例。 從源文件壓縮到新文件的示例字節,直到源上的EOF。 不使用源文件的文件大小。

您必須在示例中更改以使用自定義流的唯一內容是以下行:

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

用你的函數從流中獲取字節填充in緩沖區。

要在Zlib中處理ZIP存檔,請使用contrib / minizip 這里是關於如何使用它的討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM