Не секрет, що провідник Windows, як і більшість інших Windows-додатків, включаючи PowerShell, не вміють працювати з об'єктами файлової системи з глибокої вкладеністю папок, довжина шляху до яких перевищує 260 символів. Причому це обмеження існує тільки на рівні додатків, а сама файлова система NTFS підтримує шляху до файлів аж до 32767 символів.
Дане обмеження накладено бібліотекою Win32 API, а якої максимальна довжина шляху складає 260 символів (MAX_PATH = 260). У загальному випадку шлях формується з наступних елементів: [C: \] + [путь_із_256_сімволов] + [], причому максимальна довжина одного каталогу / файлу в NTFS - 255 символів в Unicode. При використанні Юнікодние функцій API, можливо використовувати шлях до 32767 символів. Завдяки цьому багато сторонніх програми (ті ж популярні файлові менеджери, наприклад FAR і Total Commander) Без будь-яких труднощів обробляє файли / папки, довжина шляху до яких перевищує 260 символів.
Це обмеження також не діє при мережевому доступі користувачів до файлів по протоколу SMB (за рахунок цього каталожні структури з довгими шляхами нерідкість саме на файлових серверах з одними даними). Адміністратор, який обслуговує даний сервер не може через стандартний інтерфейс провідника Windows Explorer управляти (видаляти / переміщати) файли з довгими шляхами. При спробі створити / скопіювати файл в такий каталог, з'являється помилка:
Destination Path Too Long. The file name (s) would be too long for the destination folder. You can shorten the file name and try again, or try a location that has a shorten pathІнші програми / діалогові вікна можуть повідомляти про наявність обмеження по своєму.
Погодьтеся забавно, що за вікном 2014 рік, а ми до сих пір говоримо про обмеження в 260 символів на максимальну довжину шляху в Windows ... Але схоже найближчим часом ніяких кардинальних змін не передбачається, і навіть в зовсім свіжої Windows 10 Technical Preview це обмеження все ще існує.
У цій статті ми покажемо, як в Windows можна працювати з файлами, шлях до яких перевищує 260 символів. В даному кейсі наше завдання - видалити каталог, що містить файли з великою довжиною шляху.
При спробі видалити такий каталог з провідника з'являється помилка:
The file name (s) would be too long for the destination folder. You can shorten the file name and try again, or try a location that has a shorten path.Powershell також не вміє коректно обробляти каталоги і файли з великими шляхами, що перевищують 260 символів. При спробі видалити каталог з такими файлами (C: \ Install \ MS SQL 2012 Express Edition 64 bit \ verylongpath) з'являється помилка:
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: \ Install \ MS S ... it \ verylongpath: String) [Remove-Item], PathTooLongExcepti
on
+ FullyQualifiedErrorId: RemoveItemIOError, Microsoft.PowerShell.Commands.RemoveItemCommand
Найпростіший варіант (він, власне, і пропонується в вікні з помилкою) - скоротити назву батьківських папок, зменшивши загальну довжину шляху (але може бути застосовано не завжди).
Інший варіант - створити символічне посилання на частину шляху, скоротивши тим самим загальну довжину шляху:
mklink / d c: \ install \ link "C: \ Install \ MS SQL 2012 Express Edition 64 bit \ verylongpath"
Далі файлові операції проводити з каталогом, на який призначена символьне посилання.
Ще один варіант, що нагадує роботу з символічним посиланням - зіставити проблемну папку віртуального диску (в нашому прикладі X:), тим самим також скоротивши довжину шляху:
Subst X: "C: \ Install \ MS SQL 2012 Express Edition 64 bit \ verylongpath"
Тепер можна працювати з даними на диску X :, шляху до файлів в якому не перевищуватимуть ліміт. Після закінчення роботи можна видалити віртуальний диск:
Subst X: / d
Але особисто мені найбільше для завдання видалення даних в таких ситуаціях подобається можливості robocopy.exe, яка підтримує роботу з довгими шляхами.
За допомогою опції / MIR, утиліта robocopy може створити повну копію (дзеркало) вихідного каталогу в цільовому. І, якщо вихідна папка порожня, всі дані в цільової папці також очищаються. Створимо порожню папку C: \ Install \ test і за допомогою аргументу / MIR виконаємо копіювання вміст тестової папки в цільову (якщо ім'я папки містить прогалини або символи кирилиці, шлях потрібно взяти в лапки).
robocopy / MIR C: \ Install \ test "C: \ Install \ MS SQL 2012 Express Edition 64 bit \ verylongpath"
Після виконання команди вміст каталогу C: \ Install \ MS SQL 2012 Express Edition 64 bit \ verylongpath очищається (заміняться вмістом порожнього каталогу).
Отже, сьогодні ми показали кілька простих трюків, які можна використовувати при роботі з папками на файлових серверах, що містять папки, довжина шляху до яких перевищує ліміт 260 символів.