Время на прочтение4 мин
Количество просмотров80K
Многим пользователям ПК под управлением ОС 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 на уровне системы.
Это коснулось следующих функций:
Для работы с каталогами: CreateDirectoryW, CreateDirectoryExW, GetCurrentDirectoryW, RemoveDirectoryW, SetCurrentDirectoryW. И для работы с файлами: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.
Это избавляет от необходимости использовать префикса \\?\ и потенциально даёт шанс приложениям, работающим напрямую или косвенно через Win API, получить поддержку длинных путей без необходимости их пересборки. Как активировать эту возможность описано в конце статьи.
.Net Framework
Хотя .Net Framework и использует Win API для работы с файлами — предыдущее изменение не принесло бы результата, т.к. в код BCL встроены предварительные проверки на допустимость длинны имён каталогов и файлов, и до вызова функций Win API дело даже не доходило, выдавая известное исключение. По многочисленным просьбам сообщества (более 4500 на UserVoice) в версии 4.6.2 из кода BCL вырезали проверки ограничения длинны пути, отдав это на откуп операционной и файловой системам!
Вот что это даёт:
- При использовании префикса “\\?\” мы можем работать с длинными путями как в Win API,
Directory.CreateDirectory("\\\\?\\" + long_dir_name); - Если активировать нативную поддержку длинных имен файлов Windows 10 (1607), то даже не потребуется использовать префикс!
Как включить:
- Использовать .Net Framework 4.6.2 как цель при сборке приложения.
- Использовать конфигурационный файл, например, если приложение уже было собрано под .Net 4.0:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>
</configuration>
.Net Core
Тут поддержку длинных путей анонсировали ещё в ноябре 2015 года. Видимо сказалось Open Source природа проекта и отсутствие строгой необходимости обеспечения обратной совместимости.
Как включить:
Всё работает из коробки. В отличие от реализации в .Net Framework – тут нет необходимости в добавлении префикса “\\?\” – он добавляется автоматически при необходимости.
Вот тут можно посмотреть пример.
Как включить поддержку длинных путей в Windows 10 (1607)
Эта возможность по умолчанию отключена. Это объясняется тем, что данная функция является экспериментальной, и имеется необходимость дорабатывать различные подсистемы и приложения для полной поддержки.
Включить встроенную поддержку длинных путей можно создав или изменив следующий параметр системного реестра: HKLM\SYSTEM\CurrentControlSet\Control\FileSystem Параметр LongPathsEnabled (Тип: REG_DWORD) 1 – соответствует значению включено.
Или через групповые политики (Win+R\gpedit.msc) Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.Оно же в локализованном варианте: Конфигурация компьютера > Административные шаблоны > Система > Файловая система > Включить длинные пути Win32.
Далее источники расходятся во мнении относительно манифеста (или я неправильно понял, но на данный момент проверить не имею возможности). Например, в документации MSDN написано, что манифест можно использовать в качестве альтернативного способа активации поддержки длинных путей в отдельных приложениях, а в блоге MSDN указано, что это является вторым обязательным шагом после активации в политиках.
Но они сходятся в формате задания данной опции:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
С CMD, к сожалению, это не сработает, на данный момент, из-за особенностей работы с путями, а в PowerShell должно всё заработать.
P.S.
На этом мой небольшой пятничный пост заканчивается, оставив за рамками вопросы полноты реализации поддержки длинных путей в Windows 10 (1607), или работоспособность при использовании различных комбинаций редакций Windows, файловых систем и API. По мере поступления новых фактов и результатов экспериментов пост будет обновляться.
Спасибо за внимание!
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Слишком длинное имя файла или слишком длинный целевой путь — как исправить?
При копировании, создании, сохранении или перемещении файлов и папок в Windows 11 и Windows 10 на внутреннем HDD или SSD, при копировании данных на внешний диск или флешку, вы можете столкнуться с ошибками вида «Слишком длинный целевой путь. Имена файлов слишком длинны для помещения в эту целевую папку», «Указано неправильное или слишком длинное имя файла» и другие, имеющие отношение к слишком длинным именам или путям к файлам и папкам.
В этой инструкции подробно о том, чем вызваны эти ошибки и как можно их исправить в Windows последних версий, а также дополнительная информация, которая может быть полезной, чтобы решить проблему.
- Слишком длинное имя файла или слишком длинный целевой путь
- Причины ошибки и способы её исправить
- Как включить поддержку длинных путей в Windows
- В редакторе реестра
- В редакторе локальной групповой политики
- Почему ошибка сохраняется при включенной поддержке длинных путей
Причины ошибки «Слишком длинное имя файла» и «Слишком длинный целевой путь» и способы её исправить
Несмотря на то, что файловой системой NTFS длина пути ограничена 32760 символов, в Windows существует ограничение на полный путь в 260 символов, включая путь к папке и имя файла с расширением. Ещё одно ограничение — 255 символов на имя файла или отдельной папки. Схожие ограничения есть для файловых систем FAT32 и ExFAT. Когда полный путь к файлу, с которым вы выполняете действия, превышает указанное число символов, вы можете получить сообщение об ошибках о слишком длинном целевом пути или слишком длинном имени файла.
Отсюда основные способы исправить ошибки, связанные с использованием слишком длинного пути:
- Использовать более короткие имена файлов и более простое и «компактное» дерево папок.
- Включить поддержку длинных путей — такая опция есть в Windows 10 и Windows 11, далее будет рассмотрен порядок действий. Однако, это решит не все проблемы, о чем мы также поговорим.
- Использовать файловые менеджеры, которые могут работать с длинными путями по умолчанию: Total Commander, Files (но для него потребуется включить и поддержку длинных путей в системе) или даже 7-Zip File Manager, который прекрасно с этим справляется.
Как включить поддержку длинных путей в Windows 10 и Windows 11
В зависимости от установленной редакции Windows, можно использовать один из следующих способов включения поддержки длинных путей.
В редакторе реестра
Если на вашем компьютере установлена Windows 11 или Windows 10 Домашняя, используйте редактор реестра для включения опции:
- Нажмите правой кнопкой мыши по кнопке «Пуск» и выберите пункт «Выполнить» или нажмите клавиши Win+R на клавиатуре, введите regedit и нажмите Enter.
- В редакторе реестра перейдите к разделу
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
- В правой панели редактора реестра дважды нажмите по параметру с именем LongPathsEnabled и присвойте значение 1 вместо 0 для этого параметра.
- Закройте редактор реестра, перезагрузите компьютер.
В редакторе локальной групповой политики
В Windows Pro и Enterprise можно использовать редактор локальной групповой политики:
- Нажмите клавиши Win+R на клавиатуре, введите gpedit.msc в диалоговом окне «Выполнить» и нажмите Enter.
- Перейдите к разделу Конфигурация компьютера — Административные шаблоны — Система — Файловая система.
- Дважды нажмите по параметру «Включить длинные пути Win32».
- Установите значение «Включено» для этого параметра, примените настройки.
- Закройте редактор локальной групповой политики и перезагрузите компьютер.
Готово, теперь поддержка длинных путей в Windows включена, однако это не означает, что ошибки, с ними связанные, исчезнут.
Почему ошибки длинных путей появляются, несмотря на включенную поддержку длинных путей
Даже если вы включите поддержку длинных путей к папкам и файлам в Windows 11/10, при действиях с такими файлами в проводнике и некоторых программах вы продолжите получать ошибки вида «Слишком длинный целевой путь. Имена файлов слишком длинны для помещения в эту целевую папку» или «Указано неправильное или слишком длинное имя файла», также будут недоступны некоторые действия в папках, имеющих длинный путь.
Причина этого — поддержка длинных путей требуется не только на уровне системы, но и в самой программе, которая работает с этими путями, в качестве примера:
- Проводник не сможет полноценно работать с длинными путями даже при включенной поддержке.
- Файловый менеджер Files из магазина приложений будет исправно работать, если включить поддержку длинных путей, и будет сообщать об ошибках при отключенной поддержке.
- Total Commander или встроенный файловый менеджер 7-Zip работают с длинными путями независимо от того, включена ли их поддержка в Windows.
То же самое касается не только файловых менеджеров, но и прикладных программ: текстовых, графических и видео редакторов и другого ПО.
Надеюсь, инструкция прояснила причины ошибки и возможные способы решения проблемы. Если же вопросы остаются — жду их в комментариях.
Большинство администраторов и пользователей Windows при работе с файлами, так или иначе сталкивались с ошибкой “path too long”. Эта ошибка возникает при превышении полного пути к файлу (вместе с его именем) значения 260 символов. Многие приложения, в том числе проводник Windows, неправильно работают с такими длинными именами файлов, оказываясь их открывать, перемещать и удалять. Это ограничение не файловой системы NTFS, а библиотеки Win32 API (подробнее о проблеме и обходных способах ее решения рассказано здесь).
В Windows 10 появилась возможность отключить ограничение на максимальную длину пути.
Отключить ограничение MAX_PATH можно двумя способами: с помощью редактора групповых политик или через реестр. Рассмотрим оба:
- Запустите консоль редактора локальной групповой политики, нажав Win+R и выполнив команду gpedit.msc
- Перейдите в раздел редактора Local Computer Policy -> Computer Configuration -> Administrative Templates -> System -> Filesystem -> NTFS (Конфигурация компьютера -> Административные шаблоны -> Система -> Файловая система -> NTFS)
- Откройте политику Enable NTFS long paths
- Включите политику, переведя ее в состояние Enabled
- Сохраните изменения
При использовании домашней версии Windows 10, в которой отсутствует редактор GPO, это же изменение можно внедрить с помощью редактора реестра.
-
- Запустите редактор реестра regedit.exe
- Перейдите в ветку HKLM\SYSTEM\CurrentControlSet\Control\FileSystem
- Создайте в данной ветке новый параметр типа Dword (32-bit) Value с именем LongPathsEnabled
- Чтобы отключить ограничение MAX_PATH, измените значение ключа на 1
Также вы можете включить эту функцию одной командой PowerShell:
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1
Для вступления изменений в силу в обоих случаях требуется перезагрузка компьютера. После перезагрузки пользователи и программы смогут без ограничений работать с файлами, длина пути к которым превышает 260 символов. Теперь на файлы будет действовать только ограничение файловой системы NTFS – 32767 символов .
Этот функционал доступен всем пользователям Windows 10, начиная с Anniversary Update (1607), и в Windows Server 2016.
Если вы видите это сообщение, значит, произошла проблема с загрузкой файлов в стилей (CSS) нашего сайта. Попробуйте сбросить кэш браузера (Ctrl+F5).
Если это не поможет, а вы находитесь в регионе, где возможны ограничения интернет-трафика с российских серверов — воспользуйтесь VPN.
Слишком длинное имя файла. Что делать?partnerss 3 года назад
Ситуация довольно странная. С неделю назад скопировал материалы (статьи) на флешку, а сегодня передал редактору для публикации, но при копировании ВОРД документов на его компьютер, большую часть статей скопировать не удалось, так как выскакивало сообщение «слишком длинное имя файла». «не скопированные» статьи я проверил, в их заголовке около 50-ти символов и вот что интересно, во первых есть статьи и с более длинным названием, но они скопированы успешно, а во вторых, я не понимаю, если «проблемные» статьи имеют по мнению виндовс длинное имя, то почему на флешку скопировались без проблем, а назад, на комп не хочет. Что же делать в такой ситуации? Каким (сколько символов) должно быть название файла, что бы подобные проблемы больше не возникали? alexm12 разные файловые системы и/или версии ОС на которых производились запись считывание?
partnerss Windows 7 , 32-разрядная
alexm12 у Вин7 ограничение имени файла в 256 символов, включая путь к файлу. При копировании, возможно, было дано предупреждение, которое проигнорировано.
partnerss не понимаю. «ошибку» выдало «Слишком длинное имя файла», а на сколько я понял (заголовок статьи то около 50 символов), значит проблема в «включая путь к файлу», то есть учитывается не только «имя файла», но и «длинна» всех папок? Но почему при копировании на флешку, на мой ноут (резервную копию) этого не происходило, только при копировании на чужой комп? Может действительно проблема в «умирающей» виндовс — 7″? Не хотелось бы
alexm12 May be ноут имеет папку «\users», а «другой комп» папку «\Documents and Settings»…
Drago более года назад Как я понял это из за «Слишком длинного имени файла» или «Слишком длинного целевого пути» Основным способом исправления данной ошибки будет: Использовать более короткое имя файлов и более простое и «компактное» дерево папок; Включить поддержку длинных путей, данная функция есть в Windows 10 и Windows 11; Использовать файловые менеджеры, такие как: Total Commander, Files, 7-Zip File Manager. Надеюсь данный ответ поможет вам. модератор выбрал этот ответ лучшим
в избранное
ссылка
отблагодарить 11какая разница Спасибо большое! Windows 10/11 Профессиональная/Корпоративная.
Дмитр 10 месяцев назад Самый простой и быстрый способ скопировать данные файлы состоит в том, что нужно уменьшить длину названия файла, бывают программы которые сами именуют файлы очень длинным именем. Поэтому даже если на своём компьютере и разрешить длинные имена файлов и всё будет работать, то при надобности переноса на другой, например рабочий, может возникнуть та же ситуация. Поэтому просто уменьшайте длину файлов, можно использовать всем известные сокращения слов, смысл всё равно будет понятен. Двадцать букв или цифр вполне достаточно для наименования файлов, чтобы сразу определить для чего этот файл предназначен. комментировать
в избранное
ссылка
отблагодарить Знаете ответ? |
Давно известен тот факт, что Проводник Windows и большинство Windows-приложений не могут работать с файлами и папками, длина пути к которым превышает 260 символов. И это — лишь программное ограничение на уровне Win32 API, известное также как MAX_PATH, тогда как файловая система NTFS сама по себе допускает до 32767 символов в адресе объекта файловой системы, чем успешно пользовались сторонние приложения, работавшие в обход стандартного API, например, FAR и Total Commander.
Также данное ограничение не касалось работы с файлами при сетевом доступе, что приводило к казусным ситуациям: рядовой пользователь в расшаренной папке может создавать и изменять файлы и папки, администратор через Windows Explorer — получает отказ доступа. Причём данное ограничение имело место не только в Windows 7/8/8.1 и более ранних ОС, но и в новейшей Windows 10.
Для обхода ограничения применялся, в зависимости от ситуации и уровня подготовки сидящего за ПК пользователя, целый ряд различных приёмов: символические ссылки, ручное сокращение количества символов, создание виртуальных дисков и прочее.
И вот, как сообщает ряд тестеров регулярно выпускаемых закрытых сборок Windows 10, компания Microsoft, наконец, снизошла до исправления этого недостатка и выпуска исправления. Точнее — реализации настройки, которую должен будет включить сам пользователь. В шаблонах групповых политик появился соответствующий параметр «Включение длинных адресов NTFS» (Конфигурация компьютера -> Административные шаблоны -> Система -> Файловая система -> NTFS).
Единственное, что огорчает — Редактор групповых политик (gpedit.msc) отсутствует в редакциях Windows 10, отличных от «Профессиональная» и «Корпоративная» (хотя существуют неофициальные и не совсем легальные способы обойти это ограничение). Впрочем, необходимые ключи в реестре наверняка будут найдены. Как подсказывает один из читателей, это параметр LongPathsEnabled (тип DWORD), расположенный в реестре по адресу HKEY_LOCAL_MACHINE\System\CurrentControlSet\Policies.
Telegram-канал @overclockers_news — теперь в новом формате. Подписывайся, чтобы быть в курсе всех новостей!
