前回に引き続き、System.IO.Compression.ZipFileクラスについてちょこっとメモメモ。
ZipFileクラスの概要については、前回の記事をご参照ください。
- .NET クラスライブラリ探訪-062 (System.IO.Compression.ZipFile (1), .NET 4.5から追加, ZIPファイルの圧縮/解凍)
- .NET クラスライブラリ探訪-063 (System.IO.Compression.ZipFile (2), .NET 4.5から追加, ZIPファイル内のエントリを列挙, ZipArchive, ZipArchiveEntry)
今回は、ZIPファイルを作成および更新する方法についてです。
ZipArchiveクラスの以下のメソッドを利用すると、ZIPファイルの作成および更新が行えます。
CreateEntry(string) CreateEntryFromFile(string, string)
CreateEntryFromFileメソッドの方は、元ファイルが存在する場合に利用できます。
このメソッドを利用すると、自前でストリームを開くことなく簡単にエントリを追加できます。
CreateEntryの方は、エントリを作成してくれるのみです。
データは自前で流し込む必要があります。
ZipArchiveクラスのインスタンスは、
ZipFile.Open
で取得することが出来ます。
尚、ZipFileクラスを利用する場合、参照設定に
System.IO.Compression.FileSystem.dll
ZipArchiveクラスを利用する場合、参照設定に
System.IO.Compression.dll
を追加する必要があります。
以下サンプルです。
#region ZipFileSamples-03 /// <summary> /// System.IO.Compression.ZipFileクラスのサンプルです。 /// </summary> /// <remarks> /// ZipFileクラスは、.NET Framework 4.5で追加されたクラスです。 /// このクラスを利用するには、「System.IO.Compression.FileSystem.dll」を /// 参照設定に追加する必要があります。 /// このクラスは、Metroアプリでは利用できません。 /// Metroアプリでは、代わりにZipArchiveクラスを利用します。 /// /// 尚、ZipArchiveクラスを利用する場合 /// System.IO.Compression.dll /// を参照設定に追加する必要があります。 /// </remarks> public class ZipFileSamples03 : IExecutable { string _zipFilePath; string DesktopPath { get { return Environment.GetFolderPath(Environment.SpecialFolder.Desktop); } } public void Execute() { // // ZIPファイルの作成および更新. // 作成および更新の場合、ZipArchiveクラスを利用する. // // ・エントリの追加: ZipArchive.CreateEntryFromFile OR ZipArchive.CreateEntry // // CreateEntryFromFileは、メソッドの名前が示す通り元ファイルがある場合に利用する。 // 元となるファイルが存在する場合はこれが楽である。 // // CreateEntryは、エントリのみを新規作成するメソッド。データは自前で流し込む必要がある。 // Prepare(); // // Zipファイルを新規作成. // using (var archive = ZipFile.Open(_zipFilePath, ZipArchiveMode.Create)) { // // 元ファイルが存在している場合は、CreateEntryFromFileを利用するのが楽. // archive.CreateEntryFromFile("Persons.txt", "Persons.txt"); } // // Zipファイルの内容を更新. // using (var archive = ZipFile.Open(_zipFilePath, ZipArchiveMode.Update)) { // // 元ファイルは存在するが、今度はCreateEntryメソッドで新規エントリのみを作成しデータは、手動で流し込む. // using (var reader = new BinaryReader(File.Open("database.png", FileMode.Open))) { var newEntry = archive.CreateEntry("database.png"); using (var writer = new BinaryWriter(newEntry.Open())) { WriteAllBytes(reader, writer); } } } } void Prepare() { _zipFilePath = Path.Combine(DesktopPath, "ZipTest2.zip"); if (File.Exists(_zipFilePath)) { File.Delete(_zipFilePath); } } void WriteAllBytes(BinaryReader reader, BinaryWriter writer) { try { for (;;) { writer.Write(reader.ReadByte()); } } catch (EndOfStreamException) { writer.Flush(); } } } #endregion
以下、参考資料です。
- ZipFile Class
- ZipArchive Class
- ZipArchiveEntry Class
- DotNetZip Library
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場