C#でZipファイル (DotNetZip Library)
C#から圧縮を扱う場合、.NET Framework 2.0 以上であれば、GZipStreamクラス(System.IO.Compression名前空間)があります。ただし、1ストリームの圧縮ですので、複数ファイルを直接扱うことはできませんし、圧縮率もそれほど高くありません。
.NET Framework 3.0以上であればZipPackageクラス(System.IO.Packaging名前空間)を使用できます。残念ながらこのクラスもOPC (Open Packaging Conventions)定義のデータパッケージを扱うものでZip書庫を扱うものではありません。
このため、独自アプリケーションの固有データファイルとして使用する場合は有効ですが、Zipファイルを対象とした場合使えません。
参考:saeki-k の日記:.NET Framework 3.0のZipPackageクラス
結局のところ外部のアセンブリを利用するしかありません。
現状Zipファイルにマネージドアプリケーションからアクセスす場合、DoNetZip Libraryを使用するのがよさそうです。
DotNetZip Library
DotNetZip LibraryはCodePlexで公開されている.NET言語からZipファイルを操作するためのライブラリです。
2009年2月22日時点で1.7がリリースされていて1.8のプレビュー版がアナウンスされています。
特徴
- Zip書庫の作成、ファイルやディレクトリの追加
- 既存Zip書庫からファイルの解凍
- 既存書庫の編集(エントリの名前変更・追加・削除)
- 書庫のパスワード設定
- ファイルかストリームからエントリの取得
- ファイルかストリームを使用した書庫の読み取り
また、1.7からはZlibライブラリも付属しています。
1.6を使用していて1.7移行にアップグレードする場合、ライブラリ名(DLLの名前)と名前空間が変更されているのでアプリケーション側コードの変更が必要となります。
(詳しくは1.7リリース情報のBraking change項目を参照)
実際に使用してみると、ファイルシステム上に展開されているファイルやフォルダを単純にZipにアーカイブしたり展開したりするのは非常に簡単です。
逆に既存アーカイブを細かく操作する場合、特にStreamを使用して追加削除を繰り返す場合いまいち動きがはっきりしない事があります。
たとえば、Stream指定でファイルを追加、更にSeam指定で追加した場合に先に追加したStreamが開きっぱなしになり閉じるタイミングが分からないなどです。多分そのたびにZipFile.Save( ) を呼び出せば解消されそうな気がしますが。
基本的にはとても使いやすくなっています。
簡単に使うための注意点:私的な感想です。
- 書庫内部と外部のファイル名は一致している必要がある
- うっかりするとカレントディレクトリが対象になってしまう
- ZipFile.Save( )を呼び出すまでアーカイブは更新されない
- Stream指定はできるだけ使わない
DotNetZip Libraryのライセンス
商用で使用する場合には特に重要な部分ですが、DotNetZip Librarryのライセンスページを確認するとMs-PL (Microsoft Public License)であることがわかります。
いつも思いますが、ソフトウェア特にライブラリのライセンスは難しいです。
Ms-PLについては次回。


Comments