Windowsのファイルパスは標準では260文字未満、ディレクトリ名は248文字未満となっているため、それをオーバーすると以下のようなエラーが発生します。
System.IO.PathTooLongException: 指定されたパス、ファイル名、またはその両方が長すぎます。完全限定型名は 260 文字未満で指定し、ディレクトリ名は 248 未満で指定してください。 場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 場所 System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost) 場所 System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost) 場所 System.IO.Directory.CreateDirectory(String path) 場所 CreateDirectory.Program.Main(String[] args)
しかし、PathTooLongExceptionではなく、 DirectoryNotFoundExceptionが発生してしまうことがあるのです。
using System; using System.IO; namespace CreateDirectory { internal class Program { public static void Main(string[] args) { var path = @"C:\bbbb\"; for (int i = 0; i < 270; i++) { try { path += "a"; Directory.CreateDirectory(path); Directory.Delete(path); } catch (Exception e) { Console.WriteLine($"Path Length={path.Length}:{e.GetType()}"); } } } } }
以下のような結果になり、なぜか、260文字〜260文字+サブディレクトリの文字数までは DirectoryNotFoundExceptionになってしまうのです。
Path Length=252:System.IO.PathTooLongException Path Length=253:System.IO.PathTooLongException Path Length=254:System.IO.PathTooLongException Path Length=255:System.IO.PathTooLongException Path Length=256:System.IO.PathTooLongException Path Length=257:System.IO.PathTooLongException Path Length=258:System.IO.PathTooLongException Path Length=259:System.IO.PathTooLongException Path Length=260:System.IO.DirectoryNotFoundException Path Length=261:System.IO.DirectoryNotFoundException Path Length=262:System.IO.DirectoryNotFoundException Path Length=263:System.IO.DirectoryNotFoundException Path Length=264:System.IO.PathTooLongException Path Length=265:System.IO.PathTooLongException Path Length=266:System.IO.PathTooLongException Path Length=267:System.IO.PathTooLongException Path Length=268:System.IO.PathTooLongException Path Length=269:System.IO.PathTooLongException Path Length=270:System.IO.PathTooLongException
PathTooLongExceptionであればパスが長すぎますというメッセージを出せばいいのですが、 DirectoryNotFoundExceptionでは扱いが困ります。
これはDirectory.CreateDirectory関数によるものではないようで、DirectoryInfo.Createを使ってフォルダを生成しても同様の現象になります。