Как узнать, имеются ли в вашей Windows пути, длина которых превышает 260 символов
Как в Windows 10 отключить ограничение на длину пути в 260 символов
07.04.2020
itpro
Windows 10
комментария 22
Большинство администраторов и пользователей Windows при работе с файлами, так или иначе сталкивались с ошибкой “path too long”. Эта ошибка возникает при превышении полного пути к файлу (вместе с его именем) значения 260 символов. Многие приложения, в том числе проводник Windows, неправильно работают с такими длинными именами файлов, оказываясь их открывать, перемещать и удалять. Это ограничение не файловой системы NTFS, а библиотеки Win32 API (подробнее о проблеме и обходных способах ее решения рассказано здесь).
В новой сборке Windows 10 Insider Preview Build 14352 доступной участникам программы Windows Insider, появилась новая возможность отключить ограничение на максимальную длину пути.
Отключить ограничение MAX_PATH можно двумя способами: с помощью редактора групповых политик или через реестр. Рассмотрим оба:
- Запустите консоль редактора локальной групповой политики, нажав Win+R и выполнив команду gpedit.msc
- Перейдите в раздел редактора LocalComputerPolicy -> ComputerConfiguration -> AdministrativeTemplates -> System -> Filesystem -> NTFS (Конфигурация компьютера -> Административные шаблоны -> Система -> Файловая система -> NTFS)
- Откройте политику Enable NTFS long paths
- Включите политику, переведя ее в состояние Enabled
- Сохраните изменения
При использовании домашней версии Windows 10, в которой отсутствует редактор GPO, это же изменение можно внедрить с помощью редактора реестра.
- Запустите редактор реестра regedit.exe
- Перейдите в ветку HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionGroup Policy Objects<48981759-12F2-42A6-A048-028B3973495F>MachineSystemCurrentControlSetPolicies
- Создайте в данной ветке новый параметр типа Dword(32-bit)Value с именем LongPathsEnabled
Для вступления изменений в силу в обоих случаях требуется перезагрузка компьютера. После перезагрузки пользователи и программы смогут без ограничений работать с файлами, длина пути к которым превышает 260 символов. Теперь на файлы будет действовать только ограничение файловой системы NTFS – 32767 символов .
Этот функционал доступен всем пользователям Windows 10, начиная с Anniversary Update (1607), и в Windows Server 2016.
Предыдущая статья Следующая статья
Узнай, если Windows пути к файлам превышают ограничение в 260 символов
Есть хороший шанс, что Windows пользователи сталкиваются с ограничением операционной системы 260 символов для путей. Типичный сценарий может возникнуть, когда файлы удаляются в системе. Если путь превышает лимит, файлы нельзя удалить и Windows отобразит сообщение об ошибке.
Microsoft добавила опцию в Windows несколько лет назад, чтобы увеличить предел пути, см. Microsoft завершает ограничение длинного пути 260 (вроде), но до сих пор поддержка не была добавлена глобально. Другими словами: есть шанс, что вы все еще можете столкнуться с ограничением пути на Windows машины даже сегодня.
Сторонние инструменты были созданы для решения проблем, связанных с ограничением пути на Windows машины. Мы рассмотрели Long Path Fixer уже в прошлом; на этот раз это средство проверки длины пути, которое предназначено только для отчетов, но все же полезно.
Проверка длины пути
Загрузите последнюю версию программы с сайта репозитория GitHub. Вам необходимо распаковать архив после того, как он был загружен, и после этого можно запустить его версию с графическим интерфейсом пользователя, чтобы начать работу.
Все, что требуется на базовом уровне, — это выбрать начальный каталог, например диск c: или папку на любом из подключенных дисков, и нажать кнопку «получить длину пути» после того, как выбор будет сделан. Также поддерживается перетаскивание каталога в окне программы.
Сканирование может занять некоторое время, но во время тестов скорость была приемлемой (не более нескольких минут).
Результаты отображаются в таблице, и вы можете щелкнуть заголовки столбцов для соответствующей сортировки данных, например, по длине пути. Вывод можно скопировать в буфер обмена; для этого вы должны выбрать одну или несколько записей и опцию «копировать пути в буфер обмена». Щелчок по значку со стрелкой вниз рядом с кнопкой открывает возможности для сохранения выбора в файл CSV.
Средство проверки длинного пути поддерживает фильтры сканирования и поиска, которые вы можете использовать. Помимо выбора начального каталога, вы также можете установить минимальную и максимальную длину пути, отключить включение подкаталогов и исключить файлы или папки из сканирования. Вы также можете использовать шаблон поиска и заставить программу возвращать начальный каталог в выводе со строкой.
Средство проверки длинного пути включает версию командной строки, которую вы можете запустить, и сценарий PowerShell для его запуска из PowerShell.
Закрытие слов
Long Path Checker — удобный инструмент для проверки Windows каталоги для потенциальных нарушений пути. Это удобно для разработчиков, системных администраторов, а также для домашних пользователей. Обратной стороной является то, что он не включает никаких опций для решения проблем, связанных с путями в системе.
Выбираем длинный путь (или прощай MAX_PATH)
Многим пользователям ПК под управлением ОС Windows, не говоря о разработчиках, знакомы проблемы при работе с длинными (более 260 символов, MAX_PATH) путями файлов или каталогов.
В данной статье рассматриваются способы избавления от этого пережитка при разработке приложений на различных платформах (WinApi, .Net Framework, .Net Core) и активации нативной поддержки длинных путей в Windows 10 (Anniversary Update).
Приложения Win API
В приложениях, которые используют Win API для работы с файлами, рецепт избавления от ограничения MAX_PATH был известен с незапамятных времён – необходимо было использовать Unicode версию функции с окончанием «W» для работы с директорией или файлом и начинать путь с префикса \?. Это давало возможность использовать пути длинной до 32767 символов.
В Windows 10 (1607) поведение функций для работы с файлами изменилось: появилась возможность отключить проверку ограничений MAX_PATH на уровне системы.
Это избавляет от необходимости использовать префикса \? и потенциально даёт шанс приложениям, работающим напрямую или косвенно через Win API, получить поддержку длинных путей без необходимости их пересборки. Как активировать эту возможность описано в конце статьи.
.Net Framework
Хотя .Net Framework и использует Win API для работы с файлами — предыдущее изменение не принесло бы результата, т.к. в код BCL встроены предварительные проверки на допустимость длинны имён каталогов и файлов, и до вызова функций Win API дело даже не доходило, выдавая известное исключение. По многочисленным просьбам сообщества (более 4500 на UserVoice) в версии 4.6.2 из кода BCL вырезали проверки ограничения длинны пути, отдав это на откуп операционной и файловой системам!
- При использовании префикса “\?” мы можем работать с длинными путями как в Win API,
- Если активировать нативную поддержку длинных имен файлов Windows 10 (1607), то даже не потребуется использовать префикс!
- Использовать .Net Framework 4.6.2 как цель при сборке приложения.
- Использовать конфигурационный файл, например, если приложение уже было собрано под .Net 4.0:
.Net Core
Тут поддержку длинных путей анонсировали ещё в ноябре 2015 года. Видимо сказалось Open Source природа проекта и отсутствие строгой необходимости обеспечения обратной совместимости.
Как включить:
Всё работает из коробки. В отличие от реализации в .Net Framework – тут нет необходимости в добавлении префикса “\?” – он добавляется автоматически при необходимости.
Вот тут можно посмотреть пример.
Как включить поддержку длинных путей в Windows 10 (1607)
Эта возможность по умолчанию отключена. Это объясняется тем, что данная функция является экспериментальной, и имеется необходимость дорабатывать различные подсистемы и приложения для полной поддержки.
Включить встроенную поддержку длинных путей можно создав или изменив следующий параметр системного реестра: HKLMSYSTEMCurrentControlSetControlFileSystem Параметр LongPathsEnabled (Тип: REG_DWORD) 1 – соответствует значению включено.
Или через групповые политики (Win+Rgpedit.msc) Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.Оно же в локализованном варианте: Конфигурация компьютера > Административные шаблоны > Система > Файловая система > Включить длинные пути Win32.
Далее источники расходятся во мнении относительно манифеста (или я неправильно понял, но на данный момент проверить не имею возможности). Например, в документации MSDN написано, что манифест можно использовать в качестве альтернативного способа активации поддержки длинных путей в отдельных приложениях, а в блоге MSDN указано, что это является вторым обязательным шагом после активации в политиках.
Но они сходятся в формате задания данной опции:
С CMD, к сожалению, это не сработает, на данный момент, из-за особенностей работы с путями, а в PowerShell должно всё заработать.
На этом мой небольшой пятничный пост заканчивается, оставив за рамками вопросы полноты реализации поддержки длинных путей в Windows 10 (1607), или работоспособность при использовании различных комбинаций редакций Windows, файловых систем и API. По мере поступления новых фактов и результатов экспериментов пост будет обновляться.
Как найти файлы с длиной пути, превышающей 260 символов в Windows?
Я использую xcopy в Windows XP script, чтобы рекурсивно скопировать каталог. Я продолжаю получать ошибку «Недостаточно памяти», которая, как я понимаю, связана с тем, что файл, который я пытаюсь скопировать, имеет слишком длинный путь. Я могу легко уменьшить длину пути, но, к сожалению, я не могу решить, какие файлы нарушают ограничение длины пути. Скопированные файлы печатаются на стандартный вывод (который я перенаправляю в файл журнала), но сообщение об ошибке печатается на терминале, поэтому я даже не могу определить, в какой директории это ошибка.
ОТВЕТЫ
Ответ 1
сделайте a dir /s /b > out.txt , а затем добавьте руководство в положение 260
В powershell cmd /c dir /s /b |?
Ответ 2
Я создал инструмент проверки длины пути для этой цели, что является хорошим бесплатным графическим интерфейсом, которое вы можете использовать для просмотра пути длины всех файлов и каталогов в данном каталоге.
Я также написал и написал о простой PowerShell script для получения длины файла и каталога. Он выведет длину и путь к файлу и, возможно, также напишет его на консоль. Он не ограничивает отображение файлов, которые находятся на определенной длине (простая модификация), но отображает их по убыванию по длине, поэтому по-прежнему очень легко увидеть, какие пути находятся за пределами вашего порога. Вот он:
Ответ 3
Как уточнение простейшего решения, и если вы не хотите или не хотите устанавливать Powershell, просто запустите:
И строки длиной более 260 вернутся к листингу. Обратите внимание, что вы должны добавить 1 в параметр столбца SORT (/+ n).
Ответ 4
Я сделал альтернативу другим хорошим ответам здесь, в которых используется PowerShell, но мой также сохраняет список в файл. Поделитесь им здесь, если кому-то понадобится что-то подобное.
Предупреждение: Код перезаписывает «longfilepath.txt» в текущем рабочем каталоге. Я знаю, что вряд ли у вас его есть, но на всякий случай!
Целенаправленно хотелось в одной строке:
Подробные инструкции:
- Запустить PowerShell
- Перейдите в каталог, который вы хотите проверить на длину пути к файлу (C: works)
- Скопируйте и вставьте код [Щелкните правой кнопкой мыши для вставки в PowerShell или Alt + Space > E > P]
- Подождите, пока он не будет выполнен, а затем просмотрите файл: cat longfilepath.txt | sort
Объяснение:
Out-File longfilepath.txt ; — Создайте (или перезапишите) пустой файл под названием longfilepath.txt. Секунда для разделения команд.
cmd /c «dir /b /s /a» | — Запустить команду dir на PowerShell, /a , чтобы показать все файлы, включая скрытые файлы. | в трубку.
ForEach-Object < if ($_.length -gt 250) <$_ | Out-File -append longfilepath.txt>> — для каждой строки (обозначается как $_), если длина больше 250, добавьте эту строку в файл.
Ответ 5
вы можете перенаправить stderr.
больше объяснений здесь, но имея команду вроде:
должен захватить данные, которые вы ищете.
Кроме того, в качестве трюка Windows обходит это ограничение, если путь имеет префикс \? (msdn)
Другой трюк, если у вас есть корень или место назначения, которое начинается с длинного пути, возможно, SUBST поможет:
Ответ 6
первая часть просто выполняет итерацию через эту и подпапки; использование -ErrorVariable AccessDenied означает нажимать оскорбительные элементы в переменную powershell AccessDenied .
Затем вы можете сканировать эту переменную так
Если вам не нравятся эти файлы (может быть применимо в некоторых случаях), просто отпустите часть -ErrorVariable AccessDenied .
Ответ 7
Для путей больше 260:
вы можете использовать:
Пример по 14 символам:
Чтобы просмотреть длины путей:
Получить пути больше 14:
Скриншот:
Для имен файлов больше 10:
Скриншот: