8

インストーラー ビルドの一部として、数千の大きなデータ ファイルを約 10 または 20 の「パッケージ」に圧縮する必要があり、それぞれに数百 (または数千) のファイルが含まれています。パッケージ。(必要に応じて、それらは一緒にバージョン管理されます。)

次に、実際のインストール中に、ユーザーはシステムに含めるパッケージを選択します。これにより、パッケージの更新を 1 つの大きなバージョン管理されたファイルとしてサイトからダウンロードすることもできます。何千もの個別の更新をダウンロードするように依頼するのではなく、同じパッケージ内の他の更新と同期しなくなる可能性もあります。

これらはデータ ファイルであるため、一部のファイルは設計およびコーディングの段階で定期的に変更されます。つまり、変更されたファイルが 1 つだけであっても、その特定の zip パッケージ内のすべてのファイルを再圧縮する必要があります。これにより、インストーラー ビルドのパッケージ化ステップに毎回 1 時間以上かかることになり、そのほとんどは、まだ触れていないものを再圧縮するために費やされます。

zip パッケージをそのままにして、その中の特定のファイルを置き換えることを検討しましたが、大きなファイルを zip の途中に挿入したり削除したりしても、パフォーマンスはそれほど向上しません。(少しですが、それだけの価値があるほどではありません。)

ファイルをzipパッケージに書き込む方法と一致するキャッシュされた生の「圧縮状態」に前処理することが可能かどうか疑問に思っていますが、zipヘッダー情報などではなく、データ自体のみです.

私の考えでは、それが可能であれば、ビルド ステップ中に、圧縮されたキャッシュが関連付けられていないデータ ファイルを最初に探し、そうでない場合は、そのファイルを圧縮して結果をキャッシュに書き込みます。

次に、すべてのキャッシュをファイル ストリームに追加し、ファイルに必要な適切な zip ヘッダーを追加します。

これは、ビルドごとに zip 全体を再作成していることを意味しますが、変更されたデータのみを再圧縮しています。残りはそのまま書き込まれます。これは、ディスクへの直接の書き込みであるため、非常に高速です。また、データ ファイルが変更されると、キャッシュが破棄されるため、次のビルド パスで再作成されます。

しかし、そのようなことが可能かどうかはわかりません。もしそうなら、これを試みる方法を示す文書はありますか?

4

3 に答える 3

3

はい、可能です。最も簡単な方法は、各ファイルを 1 つのエントリで関連付けられた独自の zip アーカイブに個別に圧縮することです。ファイルが変更されたら、関連する zip ファイルを置き換えて、すべてを最新の状態に保ちます。次に、単純なプログラムを作成して、これらの単一エントリの zip ファイルのセットを取得し、それらを 1 つの zip ファイルにマージできます。PKZip appnoteのドキュメントを参照する必要があります。それを見てください。

appnote を読んだので、次に行う必要があるのは、個々の zip ファイルのローカル ヘッダー、データ、および中央ヘッダーを使用し、ローカル ヘッダーとデータをそのまま新しい zip ファイルに順次書き込み、中央ヘッダーを保存することです。新しいファイル内のローカル ヘッダーのヘッダーとオフセット。次に、新しいファイルの最後に現在のオフセットを保存し、保存した中央ヘッダーを使用して新しい中央ディレクトリを書き込み、オフセットを適切に更新し、中央ディレクトリの開始のオフセットを持つ中央ディレクトリレコードの新しい終了で終了します.

アップデート:

これは書くのに十分役立つものだと判断しました。ここで入手できます。

于 2013-10-18T22:28:45.247 に答える
1

事前に各ファイルを圧縮し、最後に圧縮せずに「圧縮」して、配布可能なパッケージにすばやく集約することができます。一度にすべてのデータを圧縮するほど効率的ではありませんが、変更を加えるのはより高速になるはずです。

于 2013-10-18T17:08:34.323 に答える
0

このタイプの機能を実装する実際の exe を見つけることができないようです。私が試したほとんどの既存のマージ/更新機能を持つツールは、既に述べたようにデータ ストリームを再処理 (圧縮) するようです。

ただし、あなたまたは誰かが書きたい場合は、あなたが説明したことができるようです。ZIP ファイル形式の仕様に関するこのリンクを見ると、解析して処理する必要がある構造の概​​要を取得できます。対象のファイルを収集して破棄し、新しい/更新されたファイルをマージして、ファイルからファイルへとすばやく移動できるようです。新しい宛先アーカイブ内に新しい中央ディレクトリを再構築する必要があります (上記のリンクされたドキュメントのセクション 4.3.6 を参照)。

もう少し掘り下げた後、DotNetZip Library フォーラムには、同じタイプの機能について質問するメッセージがあり、上記で説明したのと同じような説明が表示されます。また、このドキュメントへのリンクもあります。これは、そのサポートが DotNetZip ライブラリに追加され、さらに実験できるようになる可能性があることを示しているようです。

于 2013-10-18T16:27:44.250 に答える