Поделиться через


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

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

Например, это ограничение может возникнуть, если вы клонируете репозиторий 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. Однако ваше приложение должно принять участие в новом поведении.

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

Параметр реестра для включения длинных путей

Внимание

Понять, что включение этого параметра реестра влияет только на приложения, которые были изменены, чтобы воспользоваться преимуществами новой функции. Разработчики должны объявить, что приложения должны быть в курсе длительного пути, как описано в параметрах манифеста приложения ниже. Это не изменение, которое повлияет на все приложения.

Значение 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

Это функции управления каталогами, которые больше не имеют ограничений 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, MoveFileExW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.

См. также

Функции управления файлами

Функции управления каталогами

GetVolumeInformation