Ограничение максимальной длины пути

В API Windows (за некоторыми исключениями, описанными в следующих абзацах) максимальная длина пути составляет MAX_PATH, которая определяется как 260 символов. Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имен, разделенные обратными косыми чертами, и завершающий символ NULL. Например, максимальный путь на диске D — "D:\some 256-значная строка<пути NUL>", где "<NUL>" представляет невидимый завершающийся символ NULL для текущей системной кодовой страницы. (Символы <> используются здесь для наглядности и не могут быть частью допустимой строки пути.)

Например, это ограничение может быть достигнуто при клонировании репозитория Git с длинными именами файлов в папку с длинным именем.

Примечание

Функции файлового ввода-вывода в API Windows преобразуют "/" в "\" в рамках преобразования имени в имя в стиле NT, за исключением случаев, когда используется префикс "\?\", как описано в следующих разделах.

Api Windows имеет множество функций, которые также имеют версии Юникода, чтобы разрешить путь расширенной длины для максимальной общей длины пути в 32 767 символов. Этот тип пути состоит из компонентов, разделенных обратными косыми чертами, каждый из которых до значения, возвращаемого в параметре lpMaximumComponentLength функции GetVolumeInformation (обычно это значение составляет 255 символов). Чтобы указать путь расширенной длины, используйте префикс "\?\". Например, "\\?\D:\very long path".

Примечание

Максимальный путь в 32 767 символов является приблизительным, так как префикс \\?\" может быть расширен системой до более длинной строки во время выполнения, и это расширение применяется к общей длине.

Префикс "\?\" также можно использовать с путями, созданными в соответствии с универсальным соглашением об именовании (UNC). Чтобы указать такой путь с помощью UNC, используйте префикс "\\?\UNC\". Например, "\\?\UNC\server\share", где "server" — имя компьютера, а "общий доступ" — имя общей папки. Эти префиксы не используются как часть самого пути. Они указывают на то, что путь должен быть передан в систему с минимальными изменениями. Это означает, что нельзя использовать косую черту для представления разделителей пути, точку для представления текущего каталога или двойную точку для представления родительского каталога. Так как нельзя использовать префикс \\?\" с относительным путем, относительные пути всегда ограничены в общей сложности 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 или функции каталога (список функций см. ниже). Раздел реестра не будет перезагружен в течение всего процесса. Чтобы все приложения в системе распознали значение ключа, может потребоваться перезагрузка, так как некоторые процессы могли быть запущены до установки ключа.

Вы также можете скопировать этот код в .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.