より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Directory.CreateDirectoryでPathTooExceptionのはずが、DirectoryNotFoundExceptionが発生する

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を使ってフォルダを生成しても同様の現象になります。