前回に引き続き、System.IO.Compression.ZipFileクラスについてちょこっとメモメモ。
ZipFileクラスの概要については、前回の記事をご参照ください。
- .NET クラスライブラリ探訪-062 (System.IO.Compression.ZipFile (1), .NET 4.5から追加, ZIPファイルの圧縮/解凍)
今回は、ZIPファイル内のエントリを列挙する方法についてです。
ZipFileクラスの以下のメソッドを利用すると、既存のZIPファイルを開く事が出来ます。
OpenRead(string) Open(string, ZipArchiveMode) Open(string, ZipArchiveMode, Encoding)
どのメソッドも、戻り値としてSystem.IO.Compression.ZipArchiveクラスのインスタンスを返します。
実際にZIPファイル内のエントリ取得は、ZipArchiveから行います。
ZipArchiveクラスは、IDisposableを実装しているのでusingブロックで
利用することができます。
尚、ZipArchiveクラスを利用する場合、参照設定に
System.IO.Compression.dll
を追加する必要があります。
(前回の記事にも記述していますが、ZipFileクラスはSystem.IO.Compression.FileSystem.dllを参照設定する必要があります。)
以下サンプルです。
#region ZipFileSamples-02 /// <summary> /// System.IO.Compression.ZipFileクラスのサンプルです。 /// </summary> /// <remarks> /// ZipFileクラスは、.NET Framework 4.5で追加されたクラスです。 /// このクラスを利用するには、「System.IO.Compression.FileSystem.dll」を /// 参照設定に追加する必要があります。 /// このクラスは、Metroアプリでは利用できません。 /// Metroアプリでは、代わりにZipArchiveクラスを利用します。 /// </remarks> public class ZipFileSamples02 : IExecutable { string _zipFilePath; string DesktopPath { get { return Environment.GetFolderPath(Environment.SpecialFolder.Desktop); } } public void Execute() { // // ZipFileクラスの以下のメソッドを利用すると、既存のZIPファイルを開く事が出来る。 // ・OpenRead // ・Open(string, ZipArchiveMode) // ・Open(string, ZipArchiveMode, Encoding) // どのメソッドも、戻り値としてZipArchiveクラスのインスタンスを返す。 // 実際にZIPファイル内のエントリ取得は、ZipArchiveから行う. // ZipArchiveクラスは、IDisposableを実装しているのでusingブロックで // 利用するのが好ましい。 // // 尚、ZipArchiveクラスを利用する場合、参照設定に // System.IO.Compression.dll // を追加する必要がある。 // Prepare(); // // OpenRead // using (var archive = ZipFile.OpenRead(_zipFilePath)) { archive.Entries.ToList().ForEach(PrintEntry); } // // Open(string, ZipArchiveMode) // using (var archive = ZipFile.Open(_zipFilePath, ZipArchiveMode.Read)) { // // ZipArchive.Entriesプロパティからは、ReadOnlyCollection<ZipArchiveEntry>が取得できる。 // 1エントリの情報は、ZipArchiveEntryから取得できる。 // // ZipArchiveEntryには、Nameというプロパティが存在し、このプロパティから実際のファイル名を取得できる。 // また、Lengthプロパティより圧縮前のファイルサイズが取得できる。圧縮後のサイズは、CompressedLengthから取得できる。 // エントリの内容を読み出すには、ZipArchiveEntry.Openメソッドを利用する。 // archive.Entries.ToList().ForEach(PrintEntry); } // // Open(string, ZipArchiveMode, Encoding) // using (var archive = ZipFile.Open(_zipFilePath, ZipArchiveMode.Read, Encoding.GetEncoding("sjis"))) { // テキストファイルのみ、中身を読み出して出力. archive.Entries.Where(entry => entry.Name.EndsWith("txt")).ToList().ForEach(PrintEntryContents); } File.Delete(_zipFilePath); Directory.Delete(Path.Combine(DesktopPath, "ZipTest"), recursive: true); } void Prepare() { // // サンプルZIPファイルを作成しておく. // (デスクトップ上にZipTest.zipという名称で出力される) // new ZipFileSamples01().Execute(); _zipFilePath = Path.Combine(DesktopPath, "ZipTest.zip"); } void PrintEntry(ZipArchiveEntry entry) { Console.WriteLine("[{0}, {1}]", entry.Name, entry.Length); } void PrintEntryContents(ZipArchiveEntry entry) { using (var reader = new StreamReader(entry.Open(), Encoding.GetEncoding("sjis"))) { for (var line = reader.ReadLine(); line != null; line = reader.ReadLine()) { Console.WriteLine(line); } } } } #endregion
以下、参考資料です。
- ZipFile Class
- ZipArchive Class
- ZipArchiveEntry Class
- DotNetZip Library
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場