1

私のプログラムは、複数の ZIP アーカイブを読み取り、最終的にネットワーク ソケットに書き込まれる STDOUT に書き込まれる単一の ZIP 出力ストリームを構築する必要があります。入力は既に圧縮された ZIP ファイルであるため、入力 ZIP の既に圧縮されたファイル/メンバーを取得し、それらをストリーミング出力に追加する方法を探しています (不必要な解凍と再圧縮を避けるため)。ストリーミング出力については、入力が処理されるときに出力を書き込む必要があります。これは、1) 圧縮されたすべてのデータをメモリに保持することを回避し、2) ダウンストリーム ソケットのタイムアウトを回避するためにデータの流れを維持するためです。

Archive::Zip モジュールには、おそらく解凍せずに、addMember() を介して ZIP アーカイブから別のアーカイブにメンバーをコピーするメカニズムがあります。Archive::Zip は、パイプ/ソケットにも書き込むことができます。しかし、私が見つけることができる増分書き込みはありません。アーカイブ全体を書き込む前にメモリ (またはファイル) に構築する必要がありますが、これは私が処理しているデータには大きすぎる可能性があります。

IO::Compress::Zip モジュールは、必要な種類のストリーミング出力を生成することに重点を置いています。しかし、入力 ZIP アーカイブ内の既に圧縮されたファイルを出力ストリームに追加する明らかな方法はありません。

Archive::Zip を使用して ZIP を読み取り、各ファイル/メンバーを解凍して圧縮し、STDOUT に書き込むことはうまくいくと確信していますが、これは不要なサイクルの浪費とデータ サイズ (ギガバイト) の無駄になります。処理の必要性は大きな負荷になる可能性があります。

これを達成するエレガントな方法はありますか?

見逃した 2 つの言及モジュールの機能はありますか?

4

1 に答える 1

0

このための Perl モジュールはないと思います。ただし、これを行うという名前のユーティリティがありますzipmergehttp://nih.at/libzip/zipmerge.html

libzip ディストリビューションの一部のようです: http://nih.at/libzip/index.html

于 2013-07-08T00:57:55.800 に答える