/// <summary> /// ディレクトリーの中を全部実行。 /// </summary> /// <param name="directoryLikeUmbrella">このディレクトリーの下をフラットにする。このディレクトリー自身は残す。</param> public static void GoFlat(string directoryLikeUmbrella) { Trace.WriteLine($"{LogHelper.Stamp}GoFlat : {directoryLikeUmbrella}."); // 傘の下の中間ディレクトリーたち。こいつらが消える。 IEnumerable <string> intermediateDirectories = System.IO.Directory.EnumerateDirectories( directoryLikeUmbrella, "*", System.IO.SearchOption.TopDirectoryOnly); foreach (var intermediateDir in intermediateDirectories) { // 再帰呼出し。 PathFlat.VisitIntermadiateDirectory(intermediateDir); } // 傘の直下のファイルは既にフラットなのでやる必要なし。 // ここまでで、フラットになっている。 /* * // ファイルの頭に、傘を付けていく。 * Trace.WriteLine($"{LogHelper.Stamp}GoRename: {directoryLikeUmbrella}."); * IEnumerable<string> fileNames = * System.IO.Directory.EnumerateFiles( * directoryLikeUmbrella, "*", System.IO.SearchOption.TopDirectoryOnly); * foreach (var fileName in fileNames) * { * // 親ディレクトリーの下に、親ディレクトリーの名前と、主体のファイル名を $% でくっつけたものを置く。 * // C#のメソッド名は、ノード名なのか、フルパスなのか、はっきりわかるように名付けてほしい。最後のノード名は、ファイル名を取るメソッドで代用した。 * var joinedName = $"{directoryLikeUmbrella}\\{Path.GetFileName(directoryLikeUmbrella)}$%{Path.GetFileName(fileName)}"; * * // リネーム☆ 衝突したら上書き。 * new TraceableFile(fileName).Move(new TraceableFile(joinedName), true); * } */ }
/// <summary> /// 再帰サーチ。 /// </summary> /// <param name="intermediateDir">消えていく中間ディレクトリー。</param> private static void VisitIntermadiateDirectory(string intermediateDir) { // もっと中間ディレクトリーたち。 IEnumerable <string> moreIntermediateDirectories = System.IO.Directory.EnumerateDirectories( intermediateDir, "*", System.IO.SearchOption.TopDirectoryOnly); foreach (var moreIntermediateDir in moreIntermediateDirectories) { // 再帰呼出し。 PathFlat.VisitIntermadiateDirectory(moreIntermediateDir); } // この階層のファイル。これを残す。 IEnumerable <string> files = System.IO.Directory.EnumerateFiles( intermediateDir, "*", System.IO.SearchOption.TopDirectoryOnly); foreach (var file in files) { PathFlat.DeleteParentDirectoryByMerge(new TraceableFile(file)); } }