Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

ディレクトリ名の変更を拡張メソッドで実装する

前回(以下のエントリー)のディレクトリ版を作ってみました。
ファイル名の変更を拡張メソッドで実装する - プログラマーな日々
ファイル名の変更が必要なケースは珍しくありませんが、System.IO.FileにもSystem.IO.FileInfoにも名前を変更するメソッドはありません。 そこで、ファイル名の変更を拡張メソッドでFileInfoに実装してみました。 ...

IOExtensions.cs

using System;
using System.IO;

namespace Extensions {
    public static class IOExtensions {
        /// <summary>
        /// ディレクトリの名前を変更します。
        /// </summary>
        /// <param name="self">変更するディレクトリを示すDirectoryInfo。</param>
        /// <param name="newName">変更後の名前。</param>
        public static void Rename(this DirectoryInfo self, string newName) {
            if (File.Exists(self.FullName)) {
                throw new FileNotFoundException("指定されたパスはファイルです。path:" + self.FullName);
            }
            
            self.MoveTo(Path.Combine(self.Parent.FullName, newName));
        }
    }
}

IOExtensionsTest.cs

using System;
using System.IO;
using Extensions;
using NUnit.Framework;

namespace ExtensionsTest {
    [TestFixture]    
    public class IOExtensionsTest {
        [Test]
        public void ディレクトリが存在しないときはエラー() {
            Assert.Throws<DirectoryNotFoundException>(() => new DirectoryInfo(@"c:\missing").Rename("new"));
        }

        [Test]
        public void ファイルの場合はエラー() {
            Exception ex = Assert.Throws<FileNotFoundException>(() => new DirectoryInfo(@"C:\old\old.txt").Rename("new"));
            StringAssert.StartsWith("指定されたパスはファイルです。", ex.Message);
        }

        [Test]
        public void リネーム() {
            new DirectoryInfo(@"C:\old").Rename("new");
            Assert.IsTrue(Directory.Exists(@"C:\new"));
        }
    }
}