C# Zipまるごと解凍の上書き対応(ExtractToDirectory)
概要
Zipを対象のディレクトリにまるごと解凍する場合 ZipFileExtensions.ExtractToDirectory を使いますが、
このメソッド、上書き対応してないんです。
なので、上書き対応したメソッドを定義しました。
拡張クラスで追加したのは以下メソッド
ZipArchiveEntry.IsDirectory
解凍するエントリーがフォルダかどうか判定するメソッド。
ZipArchive.ExtractToDirectory
上書きフラグを指定して、対象のディレクトリにまるごと解凍するメソッド。
ソースコード
既存の拡張クラスと領域が同じ場合、
拡張クラス名をどうつければいいか判断つかなくなりますね。
ということでとりあえず「My◯◯」形式で命名・・・。(「◯◯Ex」形式の方がいいかな?)
/// <summary> /// ZIP拡張クラス。 /// </summary> public static class MyZipFileExtensions { /// <summary> /// エントリーがディレクトリかどうか取得する。 /// </summary> /// <param name="entry">ZIPアーカイブエントリー</param> /// <returns></returns> public static bool IsDirectory(this ZipArchiveEntry entry) { return string.IsNullOrEmpty(entry.Name); } /// <summary> /// ZIPアーカイブ内のすべてのファイルを特定のフォルダに解凍する。 /// </summary> /// <param name="source">ZIPアーカイブ</param> /// <param name="destinationDirectoryName">解凍先ディレクトリ。</param> /// <param name="overwrite">上書きフラグ。ファイルの上書きを行う場合はtrue。</param> public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName, bool overwrite) { foreach (var entry in source.Entries) { var fullPath = Path.Combine(destinationDirectoryName, entry.FullName); if (entry.IsDirectory()) { if (!Directory.Exists(fullPath)) { Directory.CreateDirectory(fullPath); } } else { if (overwrite){ entry.ExtractToFile(fullPath, true); } else { if (!File.Exists(fullPath)) { entry.ExtractToFile(fullPath, true); } } } } } }
以上!