Почему проводник Windows позволяет создавать папки, которые слишком длинные для перемещения в Directory.Move, создавая исключение PathTooLongException?

Я могу вручную создать папку в проводнике Windows, полный путь составляет ровно 247 символов (исключая косую черту). Насколько я понимаю, 248 - это максимальный предел пути к имени папки, включая косую черту.

Тогда я пытаюсь использовать Directory.Move способ переименовать эту папку в более короткий путь:

string folder247CharsLong = @"C:\first level folder path - will form 247 chars\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\ccccccccccccccccccccccccccccccccccccc";

string folder215CharsLong = @"C:\first level folder path - will form 247 chars\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\SHORT";

Directory.Move(folder247CharsLong, folder215CharsLong);

Это кидает PathTooLongException - говоря: "Полное имя файла должно быть не более 260 символов, а имя каталога должно быть не более 248 символов".

Я предполагаю, что это потому, что Directory.Move добавляет пробную косую черту, а затем проверяет (путь +"\"). Длина < 248.

Метод Directory.Delete с тем же путем не выбрасывает.

Я предполагаю, что проблема в том, что Windows Explorer позволяет создавать такую ​​папку. Может ли кто-нибудь подтвердить, является ли это ошибочным поведением Windows Explorer или ошибкой в ​​Directory.Move?

1 ответ

Это зависит от версии функций API, используемых для обращения к файлам / папкам, и пространства имен, которые они используют.

В Windows API максимальная длина пути составляет 260, но версии функций API в Юникоде обрабатывают расширенную длину 32767 символов.

См. Имена файлов, пути и пространства имен в документации Microsoft для полной ссылки.

Другие вопросы по тегам