ZIPファイルとは?ファイル圧縮とアーカイブの仕組みを解説
ZIPは複数のファイルを1つにまとめ、必要に応じてサイズを小さくできるarchive formatです。メール添付、バックアップ、配布ファイル、ダウンロードパッケージなどで広く使われています。
目次
ZIPファイルとは?
ZIPファイルは、1つまたは複数のファイルとフォルダーをまとめて保存するarchive fileです。多くの場合、ファイルサイズを小さくするためにlossless圧縮も行います。
lossless圧縮なので、展開すると元のデータを完全に復元できます。画像や動画のように既に圧縮済みのファイルはあまり小さくなりませんが、テキスト、CSV、JSON、Office文書、source codeは効果が出やすいです。
ZIPの短い歴史
ZIP形式は1989年にPKWAREのPhil Katzによって作られました。高速で、複数ファイルを扱え、ランダムアクセスしやすい設計だったため、DOS時代から現在のWindows、macOS、Linux、Web配布まで長く使われ続けています。
ZIP圧縮の仕組み
ZIPはarchive containerであり、中の各ファイルごとに圧縮方式を選べます。代表的なのは圧縮しないSTOREと、広く使われるDEFLATEです。
| 方式 | ID | 説明 | 向くファイル |
|---|---|---|---|
| STORE | 0 | 圧縮せず、元のファイルをそのまま格納する | JPEG、MP4、MP3など既に圧縮済みのファイル |
| DEFLATE | 8 | LZ77 + Huffman codingによるlossless圧縮 | テキスト、ドキュメント、source code、data files |
DEFLATEアルゴリズム
DEFLATEは、繰り返しパターンを参照に置き換えるLZ77と、出現頻度の高い値を短いbit列にするHuffman codingを組み合わせます。元に戻せるlossless圧縮なので、文書やコードを安全に小さくできます。
圧縮レベル0-9
| Level | 意味 | 速度 | 圧縮率目安 |
|---|---|---|---|
| 0 | STORE、圧縮なし | 即時 | 0% |
| 1 | 最速のDEFLATE | 非常に速い | およそ50-60% |
| 6 | 多くのツールの標準バランス | 中程度 | およそ60-70% |
| 9 | 最大圧縮 | 遅い | およそ65-75% |
ZIPファイルの内部構造
ZIPには各ファイルのlocal file header、圧縮データ、central directory、end of central directory recordが含まれます。central directoryがあるため、ZIPツールはarchive全体を最初から順番に読まなくても、含まれるファイル一覧を素早く表示できます。
ZIP暗号化: ZipCrypto vs AES-256
ZIPには古いZipCryptoと、より安全なAES-256暗号化があります。機密データを送る場合は、ZipCryptoではなくAES-256対応のツールを選び、強いパスワードを使うべきです。
| 観点 | ZipCrypto | AES-256 |
|---|---|---|
| 安全性 | 弱い。known-plaintext attackに弱い | 強い。重要データにはこちらが適する |
| 速度 | 非常に速い | 少し遅いが現代の環境では実用的 |
| 互換性 | ほぼすべてのZIPツールで開ける | 7-Zip、WinRAR、macOS Archive Utilityなど多くが対応 |
| 推奨 | 機密データには避ける | 安全性を重視する場合に選ぶ |
ZIP64と4GB制限
古いZIP仕様では、1ファイルやarchive全体のサイズ、ファイル数に制限がありました。ZIP64拡張により、4GBを超える大きなファイルや多数のファイルを扱えるようになっています。
ZIPと他のarchive format
| 観点 | ZIP | 7z | RAR | tar.gz |
|---|---|---|---|---|
| 圧縮 | 良い。DEFLATEを使用 | 非常に良い。LZMA2を使用 | 高い | 良い。gzip/DEFLATEを使用 |
| OS標準対応 | 主要OSで広く対応 | ZIPより限定的 | 限定的 | Linux/macOSで強い |
| 単一ファイルの取り出し | 可能 | 可能 | 可能 | 順次読み込みが必要なことが多い |
| 暗号化 | AES-256 / ZipCrypto | AES-256、ファイル名非表示も可能 | AES-256、ファイル名非表示も可能 | 単体では基本なし |
ZIPを使うべき場面
- 複数ファイルを1つにまとめて配布したい。
- Windows、macOS、Linuxで追加ソフトなしに開ける形式にしたい。
- テキストやドキュメントを小さくして送信したい。
- フォルダー構造を保ったままバックアップしたい。
コードでZIPを扱う
多くの言語にはZIPを扱う標準ライブラリがあります。大量ファイルや大容量ファイルでは、メモリに全部載せずstreamingで作成・展開する設計が重要です。