はじめに

サイズが大きいファイルを扱うアプリケーションでは、ZIP形式にてファイルを圧縮できると便利です。そこで本稿ではDotNetZipというライブラリを紹介します。

DotNetZipを利用すると、.NET環境でZIPファイルを容易に作成し、解凍できるようになります。DotNetZipには高度な機能(パスワード設定、自己解凍書庫、圧縮レベル設定、ZIP64、AES-256bit暗号化等)が備わっているため、ZIPファイルに対する様々な操作を行えるようになります。

DotNetZipとは

DotNetZipはCodePlexにて、オープンソース(Ms-PLライセンス)として開発されています。.NET (Compact) Framework2.0以上の環境で動作するため、ASP.NET、Windowsフォーム、スマートデバイス等の開発で使用できます。

DotNetZipのWebサイト

DotNetZipはCodeplexから入手できます。ダウンロードできるファイルの種類は次の通りです。

ダウンロードファイルの種類(執筆時点の最新バージョンは1.8)

ファイル名 説明
DotNetZip-src-v1.8.x.x.zip ソースコードとサンプルコード
DotNetZipLib-DevKit-v1.8.zip デバッグ&リリースDLL、XML Document
DotNetZipLib-Runtime-v1.8.zip(msi) リリースDLL
DotNetZipUtils-v1.8.zip(msi) ユーティリティアプリケーション
DotNetZipLib-v1.8.chm ヘルプファイル

DotNetZipはC#、VB.NET、IronPython、PowerShellといった.NET対応言語で利用できます。「DotNetZipLib-Runtime-v1.8.msi」にてインストールすれば、PHP、Perl、VBScript(ASP)、JavaScript、Visual Basic、VBAからも利用できます(詳細はヘルプファイルの「DotNetZip can be used from COM Environments」をご覧ください)。 また「DotNetZipUtils-v1.8.msi」は、DotNetZipの実装サンプルとして参考になるでしょう。

DotNetZipUtils(ユーティリティアプリケーション)

ZIPファイルを作成する

それでは、Windowsアプリケーションのコード例を見ていきましょう。本稿では「DotNetZipLib-Runtime-v1.8.zip」をダウンロードし、DotNetZip-v1.8フォルダの「Ionic.Zip.dll」に参照設定を行っています。このDLLには、Zipファイルを操作する機能(Ionic.Zip名前空間)とデータの圧縮伸張を行うZlibの.NET版(Ionic.Zlib名前空間)が含まれています。

次のコードを実行すると、「ファイル1.txt」と「ファイル2.bmp」を圧縮した「サンプル.zip」が生成されます。

ZIPファイルを生成するコード(C#)

//クラスの先頭で名前空間をインポート
using Ionic.Zip;
using Ionic.Zlib;
(中略)
private void button1_Click(object sender, EventArgs e)
{
  try
  {
    //(1)ZIPクラスをインスタンス化
    using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
    {
      //(2)圧縮レベルを設定
      zip.CompressionLevel = CompressionLevel.BestCompression;

      //(3)ファイルを追加
      zip.AddFile(@"C:\ZipSample\ファイル1.txt");
      //ファイルを追加(画像フォルダ)
      zip.AddFile(@"C:\ZipSample\ファイル2.bmp", "画像");

      //(4)ディレクトリを追加する場合
      //zip.AddDirectory(@"C:\追加したいフォルダ");

      //(5)ZIPファイルを保存
      zip.Save(@"C:\ZipSample\サンプル.zip");
    }
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message,"ZIP作成失敗");
  }
}

生成されるZIPファイルの階層は下図の通りです。

ZIPファイルの階層

プログラムの流れを順に見ていきましょう。

(1)最初にZipFileクラスをインスタンス化します。日本語ファイル名を扱うためコンストラクタにてエンコーディング「shift_jis」を指定しています。ZipFileクラスは名前の通り、ZIPファイル(書庫そのもの)を表すクラスです。

(2)次に圧縮方法を指定します。CompressionLevelにて、None(圧縮なし)、BestSpeed(速度最優先)、Default(速度と圧縮率のバランス)、BestCompression(圧縮率最優先)、Level0-9(圧縮なし-圧縮率最優先)を選択できます。

ここではBestCompressionを選んだため、2Mのビットマップファイルが60Kに圧縮されました。Windows標準機能を使って圧縮した場合は65K程度だったため、まずまずの圧縮率と言えるでしょう。

(3)続けて、書庫に追加するファイルをAddFileメソッドで指定します。第2引数にて書庫内のパスを指定することもできます。例えば、""と指定すると書庫のルートに配置されます。第2引数を指定しない場合は、元のフォルダ構成で配置されます。

(4)もしファイルを個々に指定するのではなく、ディレクトリごとに指定したい場合は、AddDirectoryメソッドを使用します。

(5)最後にSaveメソッドを呼び出します。ここで指定したパスにZIPファイルが出力されます。