ASP.NETでの利用

続けて、ASP.NETのページから動的にZIPファイルを生成するコードを見てみましょう。

ASP.NETでZIPファイル(data.zip)を生成

protected void LinkButton1_Click(object sender, EventArgs e)
{
  Response.Clear();
  Response.ContentType = "application/zip";
  Response.AddHeader("content-disposition", "filename=data.zip");

  using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
  {
    const string sales = "去年,3000円\r\n今年,5000円";
    //(1)文字列からファイルを追加
    zip.AddEntry("データ.csv", "", sales);
    //(2)ダウンロード出力
    zip.Save(Response.OutputStream);
  }
}

ASP.NETでは、次の手順でZIPファイルを出力します。

(1)AddEntryメソッドは、文字列、ストリーム、バイト配列からファイルを生成して追加できます。このため、物理ファイルが存在していなくても書庫にファイルを追加できます。ここでは、文字列からファイルを生成しています(もちろん、これまで紹介したAddFileメソッドやAddDirectoryメソッドも利用できます)。
(2)WindowsフォームのサンプルではSaveメソッドの引数にファイルパスを指定していましたが、ASP.NETでは引数に「Response.OutputStream」を指定します。これによってブラウザにZIPファイルを出力することができます。

自己解凍書庫などの高度な機能を使う

最後に、様々なオプションを用いたサンプルを示しておきます。次のコードでは、パスワード付きの自己解凍書庫を作成しています(各プロパティの詳細についてはヘルプファイルをご覧ください)。

自己解凍書庫を生成するコード

//ZIPクラスをインスタンス化
using (ZipFile zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
{
  //パスワード設定
  zip.Password = "pass";

  //暗号方式を設定(AES-256bit暗号化)
  zip.Encryption = EncryptionAlgorithm.WinZipAes256;

  //4G以上のファイルがある時には、ZIP64を使用
  zip.UseZip64WhenSaving = Zip64Option.AsNecessary;

  //必要に応じてUnicodeを使用(自己解凍ウィンドウの文字化け対策)
  zip.UseUnicodeAsNecessary = true;

  //拡張子「txt」のファイルを再帰的に追加
  zip.AddSelectedFiles("*.txt",@"C:\ZipSample\",true);

  //圧縮せずにファイルを追加(MP3やJPEG等)
  zip.ForceNoCompression = true;
  zip.AddFile(@"C:\ZipSample\ファイル2.jpg");

  //書庫にコメントを設定
  zip.Comment = "DotNetZip Sample";

  //自己解凍形式で出力(WinFormアプリ:ダブルクリックして実行)
  zip.SaveSelfExtractor(@"C:\ZipSample\サンプル.exe",
      SelfExtractorFlavor.WinFormsApplication);
  //自己解凍形式で出力(コンソールアプリ:サンプル.exe -p passのように実行)
  //zip.SaveSelfExtractor(@"C:\ZipSample\サンプル.exe",
  //    SelfExtractorFlavor.ConsoleApplication, @"C:\Temp\ZipOutput");

ZipFileクラスのまとめ

本稿で紹介したZipFileクラスのメンバを整理しておきます。

ZipFileクラスの主要なメソッドとプロパティ

メンバ 説明 初期値
AddDirectory ディレクトリを追加する -
AddEntry エントリを追加する -
AddFile ファイルを追加する -
AddSelectedFiles 複数ファイルを追加する -
ExtractAll 全ファイルを解凍する -
Read ZIPを読み込む -
Save ZIPを保存する -
SaveSelfExtractor 自己解凍形式で保存する -
Comment コメント なし
CompressionLevel 圧縮レベル Default(Level6)
Encryption 暗号化方式 PkzipWeak
ExtractExistingFile 解凍時の重複設定 Throw
ForceNoCompression 圧縮を行わない false
Password パスワード なし
UseUnicodeAsNecessary 必要時にUnicode使用 false
UseZip64WhenSaving ZIP64の使用 Never

DotNetZipでは、ZipFileクラスのプロパティ設定のタイミングが出力結果に影響を与えることがあります。例えば、CompressionLevelプロパティを設定する場合、設定前に追加したファイルと、設定後で追加したファイルでは圧縮率が異なります。この点に注意してプログラミングをすると良いでしょう。

最後に

.NET環境でZipファイルを扱う方法としては、SharpZipLibや.NET3.0で追加されたZipPackageクラスも存在します。ただ最近は、機能が豊富で利用しやすいDotNetZipに注目が集まりつつあります。本稿を読んでDotNetZipに興味を持たれた方は、一度ダウンロードして試してみてはいかがでしょうか。