52565


通信用語の基礎知識さんの[ZIPコンテナの記事](https://www.wdic.org/w/TECH/ZIP%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%83%BC)を見て、自分でZIPコンテナファイルの実装を作ろうと考えているのですが、ZIPファイルを解凍せずにZIPファイルの中身を読み込んだり書き込んだりするにはどうすればいいのでしょうか？

（ZIPコンテナというのはePubで使われている規格です。）

プログラミング言語などを特定せずに書いているのはあらゆるZIPファイルを読み込むライブラリを想定して書いているからです。


CC BY-SA 4.0
2019-02-05T08:38:06.217
52561
2019-02-05T10:20:24.903
26886
question
アルゴリズム データ構造
ZIPコンテナを効率よく読み込むには？


圧縮されているままで、データの中身を読み出すのは難しいと思います。

[ZIP
(ファイルフォーマット)](https://ja.wikipedia.org/wiki/ZIP_\(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88\))は、個々のファイルが圧縮されている部分を特定するのが容易ですから、そこをメモリ上に取り出して、解凍し、データを読み出す、という手順になると思います。  
データを書き換えて書き戻すとデータ量が変わるので、工夫がひつようだろうと思います。


CC BY-SA 4.0
2019-02-05T08:51:41.743
52563
2019-02-05T08:51:41.743
217
52561
answer


回答の前に用語を整理しておきます。

  * ZIPファイル = ZIPコンテナ仕様に従って、複数ファイルをデータ圧縮・格納したファイル。
  * ZIPコンテナ = 複数の圧縮データを単一ファイルとして表現する仕様。具体的なデータ圧縮アルゴリズムは選択可能。
  * ePubではZIPコンテナ仕様に従いつつ、追加要件を課したファイル仕様となっています。

* * *

> ZIPファイルを解凍せずにZIPファイルの中身を読み込んだり書き込んだりするにはどうすればいいのでしょうか？

「複数ファイルを含んだZIPファイル全体を解凍することなく一部ファイルデータのみ読み出したい」のであれば、対象データ以外はスキップして必要な部分だけ解凍(データ展開)することは可能です。

一方で「複数ファイルを含んだZIPファイル全体を解凍することなく、一部ファイルデータのみ更新したい」場合は、圧縮後データサイズが変わってしまうため汎用対応は困難と思います。（非圧縮ファイルの編集ならば単純バイト置換＋CRC再計算で済むはず）


CC BY-SA 4.0
2019-02-05T10:20:24.903
52565
2019-02-05T10:20:24.903
49
52561
answer