そうそう、電子書籍の自分用Viewerを作るついでに、
WPFでZIPを使う方法を調べた。
ライセンス的に、DotNetZipを使うのが楽(Ms-PLライセンスらしい)みたいなのでまず、これを落としてくる。
→http://dotnetzip.codeplex.com/
んで、この中から、Releaseなionic.Zip.dllを探して、
VisualStudioのプロジェクトの参照設定に追加。
そしたら、
using Ionic.Zip;
して、こんな感じでZipFileのインスタンスを作る
ZipFile zipFile = new ZipFile(filePath, Encoding.GetEncoding("shift_jis"));
第2引数の文字コードは、ZIPアーカイブ内のファイル名の文字コード指定ね。
あと、Dispose対応なので、必要に応じてusingしてください。
zipFileは、Iteratableなクラスなので、foreach等で
foreach (ZipEntry zipEntry in zipFile) {
//ここにコード
}
等とすれば、エントリーの一覧がとれる。
zipEntry.FileNameで、アーカイブ内のファイル名などがとれる。
※ディレクトリ階層があれば、xxx/yyy/zzzの形式になっている。
今回は、圧縮ファイル内の任意のファイルをメモリー上で扱うので、
Stream stream = zipEntry.OpenReader();
でストリームを取り出して好きに読み出します。
※これもDisposable。
なお、複数のStreamを同時に使うとうまくいかないので、
そういうときには、一端、メモリーストリームに解凍データを入れて、
その上で処理をするのがよいかと。
using (var ms = new MemoryStream()) {
using (var s = entryFiles[page].OpenReader()) {
s.CopyTo(ms);
}
ms.Seek(0, SeekOrigin.Begin);
//TODO やりたい処理
}
こんな感じ?