Ограничение максимальной длины пути
В API Windows (за некоторыми исключениями, описанными в следующих абзацах), максимальная длина пути MAX_PATH, которая определяется как 260 символов. Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имен, разделенные обратными косыми чертами, и завершающий символ NULL. Например, максимальный путь на диске D — "D:\some 256-character path string<NUL>", где "<NUL>" представляет невидимый завершающий пустой символ для текущей системной кодовой страницы. (Символы <> используются здесь для наглядной ясности и не могут быть частью допустимой строки пути.)
Например, вы можете достичь этого ограничения, если клонируете репозиторий Git с длинными именами файлов в папку с длинным именем.
Примечание
Функции ввода-вывода файлов в API Windows преобразуют "/" в "\" в рамках преобразования имени в имя nt-стиля, за исключением случаев, когда используется префикс "\?\", как описано в следующих разделах.
API Windows имеет множество функций, которые также имеют версии Юникода, чтобы разрешить путь расширенной длины для максимальной общей длины пути в 32 767 символов. Этот тип пути состоит из компонентов, разделенных обратными косыми чертами, каждый из которых возвращается в параметре lpMaximumComponentLength функции GetVolumeInformation (обычно это значение равно 255 символам). Чтобы указать путь расширенной длины, используйте префикс "\\?\". Например, "\\\?\D:\очень длинный путь".
Примечание
Максимальный путь 32 767 символов является приблизительным, так как префикс "\\?\" может быть расширен до более длинной строки системой во время выполнения, и это расширение применяется к общей длине.
Префикс "\\?\" также можно использовать с путями, созданными в соответствии с соглашением об универсальном именовании (UNC). Чтобы указать такой путь с помощью UNC, используйте префикс "\\?\UNC\". Например, "\\\?\UNC\server\share", где "сервер" — это имя компьютера, а "общий ресурс" — имя общей папки. Эти префиксы не используются как часть самого пути. Они указывают на то, что путь должен передаваться системе с минимальным изменением, что означает, что нельзя использовать косую черту для представления разделителей пути или точки для представления текущего каталога или двойных точек для представления родительского каталога. Так как нельзя использовать префикс "\\?\" с относительным путем, относительные пути всегда ограничены общим количеством MAX_PATH символов.
Нет необходимости выполнять нормализацию Юникода по строкам пути и имени файла для использования функциями API ввода-вывода файлов Windows, так как файловая система обрабатывает имена путей и файлов как непрозрачную последовательность WCHAR. Любая нормализация, необходимая приложению, должна выполняться с учетом этого, вне всех вызовов связанных функций API ввода-вывода файлов Windows.
При использовании API для создания каталога указанный путь не может быть таким длинным, чтобы добавить имя файла 8.3 (то есть имя каталога не может превышать MAX_PATH минус 12).
Оболочка и файловая система имеют разные требования. С помощью API Windows можно создать путь, который пользовательский интерфейс оболочки не может правильно интерпретировать.
Включение длинных путей в Windows 10 версии 1607 и более поздних версий
Начиная с Windows 10 версии 1607, MAX_PATH ограничения были удалены из общих функций файлов и каталогов Win32. Однако необходимо согласиться на новое поведение.
Чтобы включить новое поведение длинного пути, необходимо выполнить оба следующих условия:
- Раздел реестра
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD)
должен существовать и иметь значение 1. Значение ключа будет кэшировано системой (для каждого процесса) после первого вызова затронутой функции Win32 или файла Win32 (см. ниже список функций). Раздел реестра не будет перезагружен в течение всего времени существования процесса. Чтобы все приложения в системе распознали значение ключа, может потребоваться перезагрузка, так как некоторые процессы могли начаться до установки ключа.
Вы также можете скопировать этот код в .reg
файл, который может задать его для вас, или использовать команду PowerShell из окна терминала с повышенными привилегиями:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Примечание
Этот раздел реестра также можно контролировать с помощью групповая политика по адресу Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
.
Манифест приложения также должен включать
longPathAware
элемент.<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>
Это функции управления каталогами, которые больше не имеют ограничений MAX_PATH , если вы согласитесь на длинное поведение пути: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Это функции управления файлами, которые больше не имеют ограничений MAX_PATH , если вы согласитесь на длинное поведение пути: 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.