きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

byte配列に読み込んだファイルの内容をMemoryStream上でzipファイルにする

.NET Framework 4.5 から、普通のZipファイルの圧縮・展開がとても簡単に扱えるようになりました。

例えばDBのblob(varbinary)列に格納された複数のファイル(のバイナリ)を読み出し、単一のZipファイルにアーカイブしてメモリストリーム上に保持するなら、こんな感じでできました。

// ※GetFilesFromDBはDBからファイルの情報を読みだして以下のようなクラスのIEnumerableなモノで返すと思ってくださいませ。
// class Hoge {
//   public string Name { get; set; }
//   public byte[] Bin { get; set; }
// }
var files = GetFilesFromDB();

using (var ms = new System.IO. MemoryStream())
{
  // メモリストリーム上にZipArchiveを作成する
  using ( var zipArchive = new ZipArchive(ms, ZipArchiveMode .Create, true ))
  {
    foreach ( var file in files)
    {
      // ファイルを追加していく。
      // ファイル名を指定してエントリを作って…
      var entry = zipArchive.CreateEntry(file.Name);
      using ( var es = entry.Open())
      {
        // エントリにバイナリを書き込む
        es.Write(file.Bin, 0, file.Bin.Length);
      }
    }
  }

 // あとはメモリストリーム (ms) を煮るなり焼くなり。
}

参考: ZipArchive クラス (System.IO.Compression)