System.IO.PathTooLongException の発生条件

.NET の PathTooLongException について。

こいつは名前のまんま、扱うファイルのパスが長すぎる場合に発生する例外。 DirectoryInfo#Create() のリファレンスによると、発生条件は以下の通り。

指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。

http://msdn.microsoft.com/ja-jp/library/w6esbt79(v=vs.100).aspx

ファイルのフルパスが 260 文字以上で例外ってのは試してすぐわかったけど、 248 文字ってのがなんなのかいまいちわからなかった。どうやらこれは「フォルダーのフルパス」の長さらしい。

つまり、

// ファイル名の長さ
new FileInfo(@"C:\foo\bar.txt").FullName.Length;
// パスの長さ
new FileInfo(@"C:\foo\bar.txt").Directory.FullName.Length;

という具合っぽい。

パスの長さとかファイル名の長さとか言われてもわからんがな・・・。標準的な表現なのかな・・。

2013/02/12 追記

文章ではどうもわかりにくいので、やっつけだけどテスト書いてみた、一応載せとく。 .NET4 と VS2010 で確認。

        [TestMethod]
        public void パス長が248文字だと例外発生()
        {
            var sut = new DirectoryInfo(@"D:\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            Assert.AreEqual(248, sut.FullName.Length);
            try
            {
                sut.Create();
                Assert.Fail();
            }
            catch (Exception expected)
            {
                Assert.IsTrue(expected is PathTooLongException);
            }
        }
        [TestMethod]
        public void パス長が247文字だと例外発生しない()
        {
            var sut = new DirectoryInfo(@"D:\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            Assert.AreEqual(247, sut.FullName.Length);
            try
            {
                sut.Create();
            }
            catch (Exception)
            {
                Assert.Fail();
            }
            finally
            {
                sut.Delete();
            }
        }