ファイルを移動すんのもう大変☆（＾～＾）ロケーションもオブジェクトにしようぜ☆（＾～＾）　んぼぼぼ　ぶびっば☆（＾～＾）

```C#
// System.IO;
Trace.WriteLine($"Move    : '{src}' --> '{dst}'.")
File.Move(src, dst);
```

C# にしろ Python にしろ ファイルの場所は文字列型だったりする。　

```C#
// System.IO;
src.Move(dst);
```

こう書きたい。

だから　こうする。

```C#:TraceableFile.cs
namespace Watashino.Commons.Location
{
    using System.Diagnostics;

    /// <summary>
    /// ログを出すファイル。
    /// </summary>
    public class TraceableFile
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="TraceableFile"/> class.
        /// </summary>
        /// <param name="file">ファイル・パス。</param>
        public TraceableFile(string file)
        {
            this.FullName = file;
        }

        /// <summary>
        /// Gets a フル・パス。
        /// </summary>
        public string FullName { get; private set; }

        /// <summary>
        /// 書き込み。
        /// </summary>
        /// <param name="contents">内容。</param>
        public void WriteAllText(string contents)
        {
            Trace.WriteLine($"Write   : '{this.FullName}'...");
            System.IO.File.WriteAllText(this.FullName, contents);
        }

        /// <summary>
        /// 読込み。
        /// </summary>
        /// <returns>内容。</returns>
        public string ReadAllText()
        {
            Trace.WriteLine($"Read    : '{this.FullName}'...");
            return System.IO.File.ReadAllText(this.FullName);
        }

        /// <summary>
        /// 移動。
        /// </summary>
        /// <param name="destFile">移動先。</param>
        public void Move(TraceableFile destFile)
        {
            new TraceableFile(destFile.FullName).CreateParentDirectory();

            Trace.WriteLine($"Move    : '{this.FullName}' --> '{destFile.FullName}'...");
            System.IO.File.Move(this.FullName, destFile.FullName);
        }

        /// <summary>
        /// コピー。
        /// </summary>
        /// <param name="destFile">コピー先。</param>
        /// <param name="overwrite">上書き。</param>
        public void Copy(TraceableFile destFile, bool overwrite = false)
        {
            Trace.WriteLine($"Copy    : '{this.FullName}' --> '{destFile.FullName}'...");
            System.IO.File.Copy(this.FullName, destFile.FullName, overwrite);
        }

        /// <summary>
        /// 削除。
        /// </summary>
        public void Delete()
        {
            Trace.WriteLine($"Move    : '{this.FullName}'...");
            System.IO.File.Delete(this.FullName);
        }

        /// <summary>
        /// 親ディレクトリの作成。
        /// </summary>
        public void CreateParentDirectory()
        {
            var wentParentDir = new TraceableDirectory(System.IO.Directory.GetParent(this.FullName).FullName);
            wentParentDir.Create();
        }
    }
}
```

```C#:TraceableDirectory.cs
namespace Watashino.Commons.Location
{
    using System.Diagnostics;

    /// <summary>
    /// ログを出すディレクトリー。
    /// </summary>
    public class TraceableDirectory
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="TraceableDirectory"/> class.
        /// </summary>
        /// <param name="fullName">ディレクトリーへのパス。</param>
        public TraceableDirectory(string fullName)
        {
            this.FullName = fullName;
        }

        /// <summary>
        /// Gets a フル・パス。
        /// </summary>
        public string FullName { get; private set; }

        /// <summary>
        /// 削除。
        /// </summary>
        /// <param name="recursive">中身があっても消す。</param>
        public void Delete(bool recursive)
        {
            Trace.WriteLine($"Move    : '{this.FullName}' directory ...");
            System.IO.Directory.Delete(this.FullName, recursive);
        }

        /// <summary>
        /// ディレクトリーがなければ作るぜ☆（＾～＾）
        /// </summary>
        public void Create()
        {
            Trace.WriteLine($"Create  : '{this.FullName}' directory ...");
            if (!System.IO.Directory.Exists(this.FullName))
            {
                System.IO.Directory.CreateDirectory(this.FullName);
            }
        }
    }
}
```

このライブラリだけだと　嬉しみがないんで　DynamicJson を利用して
自分のアプリケーションでは　このように使う。

```C#:わたしのファイル.cs
namespace Grayscale.CsaOpener.Location
{
    using System;
    using Codeplex.Data;
    using Grayscale.CsaOpener.Commons;

    /// <summary>
    /// 固定のディレクトリなど一元管理。
    /// </summary>
    public static class LocationMaster
    {
        static LocationMaster()
        {
            // このアプリケーション.exeと同じディレクトリに置いてある設定ファイル。
            MyAppConf = new TraceableFile(PathHelper.Combine(AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\'), "./config.json"));
            {
                var json = DynamicJson.Parse(LocationMaster.MyAppConf.ReadAllText());
                MyAppConfJson = json.Deserialize<OpenerConfigJson>();
            }

            // ゲームエンジンの設定ファイル。
            Kw29Conf = new TraceableFile(LocationMaster.MyAppConfJson.kifuwarabe_wcsc29_config_path);
            {
                var json = DynamicJson.Parse(LocationMaster.Kw29Conf.ReadAllText());
                Kw29ConfJson = json.Deserialize<KifuwarabeWcsc29ConfigJson>();
            }

            // 解凍フェーズ。
            ExpansionGoDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.expansion.go);
            ExpansionGoDirectory.Create();

            ExpansionWentDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.expansion.went);
            ExpansionWentDirectory.Create();

            ExpansionOutputDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.expansion.output);
            ExpansionOutputDirectory.Create();

            // エンコーディング・フェーズ。
            FomationGoDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.formation.go);
            FomationGoDirectory.Create();

            FomationWentDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.formation.went);
            FomationWentDirectory.Create();

            FomationOutputDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.formation.output);
            FomationOutputDirectory.Create();

            // 棋譜読取フェーズ。
            EatingGoDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.eating.go);
            EatingGoDirectory.Create();

            EatingWentDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.eating.went);
            EatingWentDirectory.Create();

            EatingOutputDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.eating.output);
            EatingOutputDirectory.Create();

            // 成果物ディレクトリー。
            RpmRecordDirectory = new TraceableDirectory(LocationMaster.Kw29ConfJson.rpm_record);
            RpmRecordDirectory.Create();
        }

        /// <summary>
        /// Gets a 棋譜読取待ちディレクトリー。
        /// </summary>
        public static TraceableDirectory EatingGoDirectory { get; private set; }

        /// <summary>
        /// Gets a 棋譜読取済みディレクトリー。
        /// </summary>
        public static TraceableDirectory EatingWentDirectory { get; private set; }

        /// <summary>
        /// Gets a 棋譜読取成果ディレクトリー。
        /// </summary>
        public static TraceableDirectory EatingOutputDirectory { get; private set; }

        /// <summary>
        /// Gets a 解凍待ちディレクトリー。
        /// </summary>
        public static TraceableDirectory ExpansionGoDirectory { get; private set; }

        /// <summary>
        /// Gets a 解凍済みディレクトリー。
        /// </summary>
        public static TraceableDirectory ExpansionWentDirectory { get; private set; }

        /// <summary>
        /// Gets a 解凍の成果ディレクトリー。
        /// </summary>
        public static TraceableDirectory ExpansionOutputDirectory { get; private set; }

        /// <summary>
        /// Gets a エンコーディング待ちディレクトリー。
        /// </summary>
        public static TraceableDirectory FomationGoDirectory { get; private set; }

        /// <summary>
        /// Gets a エンコーディング済みディレクトリー。
        /// </summary>
        public static TraceableDirectory FomationWentDirectory { get; private set; }

        /// <summary>
        /// Gets a エンコーディング成果ディレクトリー。
        /// </summary>
        public static TraceableDirectory FomationOutputDirectory { get; private set; }

        /// <summary>
        /// Gets a 成果物ディレクトリー。
        /// </summary>
        public static TraceableDirectory RpmRecordDirectory { get; private set; }

        /// <summary>
        /// Gets a 設定ファイル。
        /// </summary>
        public static TraceableFile Kw29Conf { get; private set; }

        /// <summary>
        /// Gets a このアプリケーション.exeと同じディレクトリに置いてある設定ファイル。
        /// </summary>
        public static TraceableFile MyAppConf { get; private set; }

        /// <summary>
        /// Gets a このアプリケーション.exeと同じディレクトリに置いてある設定ファイルの内容。
        /// </summary>
        public static OpenerConfigJson MyAppConfJson { get; private set; }

        /// <summary>
        /// Gets a ゲームエンジンの設定ファイルの内容。
        /// </summary>
        public static KifuwarabeWcsc29ConfigJson Kw29ConfJson { get; private set; }
    }
}
```

JSON用のクラスの説明は省略。
ファイルパスを　プログラム上から　一掃したら　プログラムの組み勝手は　だいぶマシになった。

見ろ、英語能力がないから　変な変数名になってる。