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に興味を持たれた方は、一度ダウンロードして試してみてはいかがでしょうか。