ZipファイルにアクセスするためのライブラリとしてはDotNetZipが有名だが、.NET標準のSystem.IO.Compression.ZipArchiveクラスを使用した、ZIPファイルの作成についての備忘録を書いてみようと思う。
なぜ、ZipArchiveを利用しようとしたのかというと、最初はDotNetZipを使ってコードを書いたのだが、Webページからのダウンロードがうまく動作せず、原因を突き止めるより、別のライブラリを使用した方が早いかなという感じで、色々調べてみたのだが、まぁ、.NET標準だし、これでいいかなと採用したわけ。
ZIPファイルを作成するには、ZipFileクラスを使った方が簡単なのだが、今回はWebアプリで、動的に作成した内容をZip化したいので、ZipArchiveクラスを使用する。
ZipArchiveクラスは書込先となるStreamを指定して作成する。その中にエントリを追加して行く形だ。
実際のコードを見てみると以下のような感じ。
using System.IO;
using System.IO.Compression;
・・・
using(MemoryStream zipstream = new MemoryStream()) { // ZipArchiveを書込むStream
using(ZipArchive ar = new ZipArchive(zipstream,ZipArchiveMode.Create,true)) { // ZipArchiveの作成
// ZipEntry=ファイルの作成
ZipArchiveEntry ent = ar.CreateEntry(entry1);
using(Stream stm = ent.Open()) { // エントリのStreamを取得
using(StreamWriter wtr = new StreamWriter(stm,Encoding.GetEncoding("shift_jis"))) { // 文字列書き込み用StreamWriter
// ファイル内容作成
・・・
await wtr.FlushAsync();
await stm.FlushAsync();
}
}
// 必要分上記の繰返し
・・・
}
await zipstream.FlushAsync();
byte[] buff = zipstream.ToArray();
return File(buff,"application/octet-stream",ZipFileName);
}
DotNetZipと比べると多少面倒で、パスワードがけられない等の問題もあるけど、目的が果たせたから良しとしよう。