2016-08-22 5 views
0

私は、ジップアーカイブファイルを書き込むためにJavaの標準ライブラリを使用していました。この場合、格納するファイルを知る必要はありませんあらかじめzipファイルを作成しておくと、新しいZipEntryを作成してZipFileストリームに書き込むだけです。初期ファイルサイズを知らずにC++で圧縮ファイルを作成する

一方、C++用のLibArchiveとZLibは、あらかじめアーカイブするファイル情報を設定する必要があります。私の場合、圧縮したいデータはexternストリームから来ているため、サイズを問い合わせることができませんストリーム自体のこれらのライブラリを使用するライブラリ/方法はありますか?最初のファイル情報は不要ですか?

EDITまた、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); 
+0

おすすめのおすすめはすぐに南に行きます。 DOSに関する[help](http://stackoverflow.com/help)セクションを参照してください。そして、JAVAとそのlibsの言及は、C++関連の質問には意味がありません。 –

+0

これは、この非常にstackexchangeコミュニティの典型的な問題です... – jackb

+0

実際にはありません。私たちはすべてそれを通過しました。私が初心者のときにも私に起こった。あなたがSOの方法を学ぶと、それは簡単です。 –

答えて

3

公式Zlib siteでサンプルを確認してください。ソースファイルのサンプルバイト数で、ソース上のEOFまで新しいファイルに圧縮されます。ソースファイルのファイルサイズは使用されません。カスタム・ストリームを使用するために、サンプルに変更する必要があります

唯一のものは、この行です:

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

inバッファを埋めるためにストリームからバイトを得るためにあなたの機能を使用してください。

ZlibでZIPアーカイブを処理するにはcontrib/minizipを使用してください。 Hereには、その使用方法が記載されています。

+0

ちなみに、この方法では、1つのファイルを1時間に1つだけ圧縮し、ZIPアーカイブは実行しません。 ZIPアーカイブでも同じことが可能ですか? – jackb

+1

@jackb Zlib自体はZIPアーカイブを扱うことはできませんが、[contrib \ minizip](https://github.com/madler/zlib/tree/master/contrib/minizip)に拡張子があります。 – Nikita

+0

ありがとう、私はそれを確認しようとします。私は自分の質問を編集して、私がzipアーカイブを参照していることを明確にします。 – jackb

関連する問題