命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術や趣味についてのメモ。

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); 
                        }
                    }
                }
            }
        }
    }

以上!