ZipArchiveによる、ZIPファイルの作成

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と比べると多少面倒で、パスワードがけられない等の問題もあるけど、目的が果たせたから良しとしよう。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください