はじめに
サイズが大きいファイルを扱うアプリケーションでは、ZIP形式にてファイルを圧縮できると便利です。そこで本稿ではDotNetZipというライブラリを紹介します。
DotNetZipを利用すると、.NET環境でZIPファイルを容易に作成し、解凍できるようになります。DotNetZipには高度な機能(パスワード設定、自己解凍書庫、圧縮レベル設定、ZIP64、AES-256bit暗号化等)が備わっているため、ZIPファイルに対する様々な操作を行えるようになります。
DotNetZipとは
DotNetZipはCodePlexにて、オープンソース(Ms-PLライセンス)として開発されています。.NET (Compact) Framework2.0以上の環境で動作するため、ASP.NET、Windowsフォーム、スマートデバイス等の開発で使用できます。
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の実装サンプルとして参考になるでしょう。
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ファイルが出力されます。