Почему проводник 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 для полной ссылки.