Не секрет, что проводник Windows, как и большинство других Windows-приложений, включая PowerShell, не умеют работать с объектами файловой системы с глубокой вложенностью папок, длина пути к которым превышает 260 символов . Причем это ограничение существует только на уровне приложений, а сама файловая система NTFS поддерживает пути к файлам вплоть до 32767 символов.
Данное ограничение наложено библиотекой Win32 API , а которой максимальная длина пути составляет 260 символов ( MAX_PATH=260 ). В общем случае путь формируется из следующих элементов: [C:]+[путь_из_256_символов]+[<NUL>] , причем максимальная длина одного каталога/файла в NTFS — 255 символов в Unicode. При использовании юникодных функций API, возможно использовать путь до 32767 символов. Благодаря этому многие сторонние программы (те же популярные файловые менеджеры, например FAR и Total Commander ) без каких-либо трудностей обрабатывает файлы/папки, длина пути к которым превышает 260 символов.
Это ограничение также не действует при сетевом доступе пользователей к файлам по протоколу SMB (за счет этого каталожные структуры с длинными путями нередкость именно на файловых серверах с пользовательскими данными). Администратор, обслуживающий данный сервер не может через стандартный интерфейс проводника Windows Explorer управлять (удалять/перемещать) файлы с длинными путями. При попытке создать/скопировать файл в такой каталог, появляется ошибка:
Другие программы/диалоговые окна могут сообщать о наличии ограничения по своему.
Согласитесь забавно, что за окном 2014 год, а мы до сих пор говорим об ограничении в 260 символов на максимальную длину пути в Windows… Но похоже в ближайшее время никаких кардинальных изменений не предвидится, и даже в совсем свежей Windows 10 Technical Preview это ограничение все еще существует.
В этой статье мы покажем, как в Windows можно работать с файлами, путь к которым превышает 260 символов. В данном кейсе наша задача – удалить каталог, содержащий файлы с большой длиной пути.
При попытке удалить такой каталог из проводника появляется ошибка:
Powershell также не умеет корректно обрабатывать каталоги и файлы с большими путями, превышающими 260 символов. При попытке удалить каталог с такими файлами (C:InstallMS SQL 2012 Express Edition 64 bitverylongpath) появляется ошибка:
Remove-Item .verylongpath -Recurse
Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260
characters, and the directory name must be less than 248 characters.
At line:1 char:1
+ Remove-Item .verylongpath -Recurse
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (C:InstallMS S...itverylongpath:String) [Remove-Item], PathTooLongExcepti
on
+ FullyQualifiedErrorId : RemoveItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Самый простой вариант (он, собственно, и предлагается в окне с ошибкой) – сократить название родительских папок, уменьшив общую длину пути (но применимо не всегда).
Другой вариант – создать символическую ссылку на часть пути, укоротив тем самым общую длину пути:
mklink /d c:installlink “C:InstallMS SQL 2012 Express Edition 64 bitverylongpath”
Далее файловые операции проводить с каталогом, на который назначена символьная ссылка.
Еще один вариант, напоминающий работу с символьной ссылкой — сопоставить проблемную папку виртуальному диску (в нашем примере X: ), тем самым также сократив длину пути:
Subst X: “C:InstallMS SQL 2012 Express Edition 64 bitverylongpath”
Теперь можно работать с данными на диске X:, пути к файлам в котором не будут превышать лимит. После окончания работы можно удалить виртуальный диск:
Subst X: /d
Но лично мне больше всего для задачи удаления данных в таких ситуациях нравится возможности robocopy.exe , которая поддерживает работу с длинными путями.
С помощью опции /MIR , утилита robocopy может создать полную копию (зеркало) исходного каталога в целевом. И, если исходная папка пустая, все данные в целевой папке также очищаются. Создадим пустую папку C:Installtest и с помощью аргумента /MIR выполним копирование содержимое тестовой папки в целевую (если имя папки содержит пробелы или кириллические символы, путь нужно взять в кавычки).
robocopy /MIR C:Installtest "C:InstallMS SQL 2012 Express Edition 64 bitverylongpath"
После выполнения команды содержимое каталога C:InstallMS SQL 2012 Express Edition 64 bitverylongpath очищается (заменятся содержимым пустого каталога).
Итак, сегодня мы показали несколько простых трюков, которые можно использовать при работе с папками на файловых серверах, содержащих папки, длина пути к которым превышает лимит 260 символов.