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