6

ファイル (.jar または .swf) が表示されるとすぐにダウンロードを開始するという点で、Flash や Java に似たブラウザー プラグインを作成しています。Java は jar ファイル全体がロードされるまで待機しますが (私は信じています)、Flash は待機しません。同じ機能が必要ですが、圧縮されたアーカイブ ファイルが必要です。解凍に必要なバイトがダウンロードされたらすぐに、アーカイブ内のファイルにアクセスしたいと考えています。

たとえば、アーカイブをメモリ バッファーにダウンロードしていて、最初のファイルを解凍できるようになったらすぐに (メモリ バッファーにも) 解凍できるようにしたいと考えています。

これをサポートするフォーマット/ライブラリはありますか?

編集:可能であれば、gz/bzip2 や tar のように、圧縮とアーカイブ用に個別のファイル形式ではなく、単一のファイル形式を使用したいと思います。

4

3 に答える 3

6

ここに2つの問題があります

  1. コードの書き方。

  2. 使用する形式。

ファイル形式について、.ZIP 形式はファイルの末尾に目次を配置するため、使用できません。つまり、ファイルの内容を知る前に、ファイル全体をダウンロードする必要があります。Zip にはスキャンできるヘッダーがありますが、それらのヘッダーはファイルの内容の公式リストではありません。

Zip では、ファイルをすばやく追加できるため、明示的に目次を最後に配置します。

ファイル 'a'、'b'、および 'c' を含む zip ファイルがあるとします。「c」を更新します。zip では、目次を読み取り、新しい c を追加し、新しい 'c' を指す新しい目次を書き込むことは完全に有効ですが、古い 'c' はまだファイル内にあります。ヘッダーをスキャンすると、古い「c」がファイルに残っているため、最終的に表示されます。

この追加機能は、zip の明示的な設計目標でした。これは、zip が複数のフロッピー ディスクにまたがることができた 1980 年代に由来します。ファイルを追加する必要がある場合、zip ファイル全体を書き直すためだけに N 個のディスクをすべて読み取らなければならないのは面倒です。代わりに、この形式では更新されたファイルを最後に追加するだけで済みます。つまり、最後のディスクだけが必要です。古い TOC を読み取り、新しいファイルを追加し、新しい TOC を書き込むだけです。

gzip された tar ファイルには、この問題はありません。tar ファイルは、ヘッダー、ファイル、ヘッダー ファイルに格納され、その上に圧縮が適用されるため、ダウンロードしたファイルのまま解凍し、ファイルが使用可能になったときに使用することができます。Windows では winrar (商用) または 7-zip (無料) を使用して、gzip で圧縮された tar ファイルを簡単に作成できます。Linux では、osx および cygwin では tar コマンドを使用します。

書くコードについては、

O3D はこれを行い、オープン ソースであるため、コードhttp://o3d.googlecode.comを見ることができます 。

解凍コードは o3d/import/cross/... にあります。

o3d/plugin/cross にある接着剤を使用して NPAPI をターゲットにしています。

于 2009-07-21T19:44:42.233 に答える
5

boost::zlib フィルター を確認してください。彼らはzlibを簡単に使用できるようにします。

ファイルを解凍してコンソールに書き込むブースト ドキュメントのサンプルを次に示します。

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

int main() 
{
    using namespace std;

    ifstream file("hello.z", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(zlib_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}
于 2009-07-21T15:40:52.320 に答える
2

確かに、たとえばzlibは、関数 inflateInit、inflate、deflateInit、deflate を介した増分圧縮と圧縮解除にz_streamを使用します。libzip2にも同様の機能があります。

アーカイブからのインクリメンタル抽出 (圧縮されたとき) については、たとえば、古き良きtar形式を参照してください。

于 2009-07-21T15:39:43.600 に答える