Не секрет, що провідник Windows, як і більшість інших Windows-додатків, включаючи PowerShell, не вміють працювати з об’єктами файлової системи з глибокої вкладеністю папок, довжина шляху до яких перевищує 260 символів. Причому це обмеження існує тільки на рівні додатків, а сама файлова система NTFS підтримує шляху до файлів аж до 32767 символів.


Дане обмеження накладено бібліотекою API Win32, А якою максимальна довжина шляху складає 260 символів (MAX_PATH = 260). У загальному випадку шлях формується з наступних елементів: [C:]+[путь_из_256_символов]+[<NUL>], Причому максимальна довжина одного каталогу / файлу в NTFS – 255 символів в Unicode. При використанні Юнікодние функцій API, можливо використовувати шлях до 32767 символів. Завдяки цьому багато сторонніх програми (ті ж популярні файлові менеджери, наприклад ДАЛЬКИ і Тотальний командир) Без будь-яких труднощів обробляє файли / папки, довжина шляху до яких перевищує 260 символів.

Порада. Обійти це обмеження Win32 API і працювати з довгими іменами файлів можна за рахунок використання UNC-формату шляху, вказуючи абсолютний шлях до файлу з використанням префікса extended-length path \? . Наприклад, так \? C: SomeLongPath LongNameFile.txt

Це обмеження також не діє при мережевому доступі користувачів до файлів по протоколу SMB (за рахунок цього каталожні структури з довгими шляхами нерідкість саме на файлових серверах з одними даними). Адміністратор, який обслуговує даний сервер не може через стандартний інтерфейс провідника Windows Explorer управляти (видаляти / переміщати) файли з довгими шляхами. При спробі створити / скопіювати файл в такий каталог, з’являється помилка:

Шлях призначення занадто довгий. Імена файлів будуть занадто довгими для цільової папки. Ви можете скоротити ім’я файлу та спробувати ще раз, або спробувати розташування, яке має скорочений шлях

Обмеження на довжину шляху в Windows

Інші програми / діалогові вікна можуть повідомляти про наявність обмеження по своєму.

Погодьтеся забавно, що за вікном 2014 рік, а ми до сих пір говоримо про обмеження в 260 символів на максимальну довжину шляху в Windows … Але схоже найближчим часом ніяких кардинальних змін не передбачається, і навіть в зовсім свіжої Windows 10 Technical Preview це обмеження все ще існує.

У цій статті ми покажемо, як в Windows можна працювати з файлами, шлях до яких перевищує 260 символів. В даному кейсі наше завдання – видалити каталог, що містить файли з великою довжиною шляху.

При спробі видалити такий каталог з провідника з’являється помилка:

Імена файлів будуть занадто довгими для цільової папки. Ви можете скоротити ім’я файлу та спробувати ще раз, або спробувати розташування, яке має скорочений шлях.

Помилка видалення файлу з великою довжиною шляху

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:InstallMS S...itverylongpath:String) [Remove-Item], PathTooLongExcepti
on
+ FullyQualifiedErrorId : RemoveItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand

Помилка при видаленні каталогу за допомогою командлета Powershell Remove-Item

Найпростіший варіант (він, власне, і пропонується в вікні з помилкою) – скоротити назву батьківських папок, зменшивши загальну довжину шляху (але може бути застосовано не завжди).

Інший варіант – створити символічне посилання на частину шляху, скоротивши тим самим загальну довжину шляху:

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, Яка підтримує роботу з довгими шляхами.

За допомогою опції / Я, Утиліта robocopy може створити повну копію (дзеркало) вихідного каталогу в цільовому. І, якщо вихідна папка порожня, всі дані в цільової папці також очищаються. Створимо порожню папку C: Install test і за допомогою аргументу / MIR виконаємо копіювання вміст тестової папки в цільову (якщо ім’я папки містить прогалини або символи кирилиці, шлях потрібно взяти в лапки).

robocopy /MIR C:Installtest "C:InstallMS SQL 2012 Express Edition 64 bitverylongpath"

robocopy / mir - створюємо дзеркало порожнього каталогуробокопія / МІР

Після виконання команди вміст каталогу C: Install MS SQL 2012 Express Edition 64 bit verylongpath очищається (заміняться вмістом порожнього каталогу).

Отже, сьогодні ми показали кілька простих трюків, які можна використовувати при роботі з папками на файлових серверах, що містять папки, довжина шляху до яких перевищує ліміт 260 символів.

Leave a Reply

Your email address will not be published. Required fields are marked *