6

zip ファイル形式は、ファイル内の個々の zip エントリを指す中央ディレクトリ セクションで終わります。これにより、zip エントリが zip ファイル自体の任意の場所に発生する可能性があるようです。実際、自己解凍型の zip ファイルが良い例です。ファイルは実行可能ファイルで始まり、すべての zip エントリは実行可能ファイルのバイトの後にあります。

問題は、zip ファイル形式では、まばらな、または連続していない zip エントリが本当に許可されるのかということです。たとえば、zip エントリ間に空のバイトまたは不明なバイトがある場合はどうなりますか? 決定的な PK ノートとウィキペディアの記事の両方がこれを許可しているようです。すべての/ほとんどの一般的な zip ユーティリティは、このようなスパース zip ファイルで動作しますか?

使用例は次のとおりです。zip ファイル内の zip エントリを削除または置換できるようにしたいです。これを行うために、一般的な minizip などのライブラリでは、削除または置換された zip エントリをコピーするのではなく、zip ファイル全体をコピーする必要がありますが、これは無駄で遅いようです。

エントリのストレージの 1.5 倍など、過剰に割り当てたほうがよいのではないでしょうか。エントリを削除または置換するときに、割り当てられていないバイトがどこにあるかを把握し、それらを直接使用できますか? 1.5 倍のストレージを使用するということは、zip エントリが直線的に増加した場合、再割り当ても直線的に償却されることを意味します。おそらくそれほど洗練されていませんが、ファイルシステムのブロック割り当てに似ています。

これは、多くの zip ベースのファイル形式にも役立ちます。編集/変更のために一時的に解凍されたファイルを含む一時ディレクトリをどこかに (またはメモリ内に) 持つ必要がなく、そのロットをファイル形式に再圧縮する必要がなくなります。これにより、zip の一部を再圧縮して再書き込みする必要がなくなります。ファイル。

これを行う C/C++ ライブラリはありますか?

4

1 に答える 1

4

いいえ。中央ディレクトリの読み取りはオプションです。zip デコーダーは、ローカル ヘッダーとエントリ データが連続して表示されることを期待して、単純に zip ファイルを最初から順番に読み取ることができます。彼らは、中央のディレクトリを見ることさえしなくても、解読の仕事を完了することができます。

必要なことを行うには、そのスペースを保持するために、有用なエントリの間にダミーの zip エントリを配置する必要があります。少なくとも、残りの zip ワールドと互換性を持ちたい場合は.

于 2012-09-12T17:40:27.763 に答える