최대 경로 길이 제한

Windows API에서(다음 단락에서 설명하는 몇 가지 예외 포함) 경로의 최대 길이는 MAX_PATH이며 260자로 정의됩니다. 로컬 경로는 드라이브 문자, 콜론, 백슬래시, 백슬래시로 구분된 이름 구성 요소 및 종료 Null 문자의 순서로 구성됩니다. 예를 들어 드라이브 D의 최대 경로는 "D:\일부 256자 경로 문자열<NUL>"입니다. 여기서 "<NUL>"은 현재 시스템 코드 페이지의 보이지 않는 종료 Null 문자를 나타냅니다. (여기에 시각적 명확성을 위해 <> 문자가 사용되며 유효한 경로 문자열의 일부가 될 수 없습니다.)

예를 들어 파일 이름이 긴 Git 리포지토리를 이름이 긴 폴더에 복제하는 경우 이 제한에 도달할 수 있습니다.

참고

Windows API의 파일 I/O 함수는 다음 섹션에 설명된 대로 "\\?\" 접두사를 사용하는 경우를 제외하고 이름을 NT 스타일 이름으로 변환하는 과정의 일부로 "/"를 "\"로 변환합니다.

Windows API에는 최대 총 경로 길이가 32,767자인 확장 길이 경로를 허용하는 유니코드 버전도 있는 많은 함수가 있습니다. 이 유형의 경로는 백슬래시로 구분된 구성 요소로 구성되며, 각 구성 요소는 GetVolumeInformation 함수의 lpMaximumComponentLength 매개 변수에 반환된 값까지입니다(이 값은 일반적으로 255자임). 확장 길이 경로를 지정하려면 "\\?\" 접두사를 사용합니다. 예를 들어 "\\?\D:\매우 긴 경로"입니다.

참고

"\\?\" 접두사는 런타임에 시스템에서 더 긴 문자열로 확장될 수 있고 이 확장은 총 길이에 적용되므로 최대 경로 32,767자는 근사치입니다.

"\\?\" 접두사는 UNC(범용 명명 규칙)에 따라 생성된 경로와 함께 사용할 수도 있습니다. UNC를 사용하여 이러한 경로를 지정하려면 "\\?\UNC\" 접두사를 사용합니다. 예를 들어 "\\?\UNC\server\share"입니다. 여기서 "server"는 컴퓨터의 이름이고 "share"는 공유 폴더의 이름입니다. 이러한 접두사는 경로 자체의 일부로 사용되지 않습니다. 최소한으로 수정하여 경로가 시스템에 전달되어야 함을 나타냅니다. 즉, 슬래시를 사용하여 경로 구분 기호를 나타내거나, 마침표를 사용하여 현재 디렉터리를 나타내거나, 이중 점을 사용하여 부모 디렉터리를 나타낼 수 없습니다. 상대 경로와 함께 "\\?\" 접두사를 사용할 수 없으므로 상대 경로는 항상 총 MAX_PATH 문자로 제한됩니다.

파일 시스템은 경로 및 파일 이름을 불투명한 WCHAR 시퀀스로 처리하므로 Windows 파일 I/O API 함수에서 사용하기 위해 경로 및 파일 이름 문자열에서 유니코드 정규화를 수행할 필요가 없습니다. 관련 Windows 파일의 I/O API 함수에 대한 호출 외부에서는 이 점을 염두에 두고 애플리케이션에 필요한 모든 정규화를 수행해야 합니다.

API를 사용하여 디렉터리를 만드는 경우 8.3 파일 이름을 추가할 수 없을 만큼 지정된 경로가 길 수 없습니다(즉, 디렉터리 이름이 MAX_PATH에서 12를 뺀 값을 초과할 수 없음).

셸과 파일 시스템에는 요구 사항이 다릅니다. 셸 사용자 인터페이스가 제대로 해석할 수 없는 Windows API를 사용하여 경로를 만들 수 있습니다.

Windows 10 버전 1607 이상에서 긴 경로 사용

Windows 10 버전 1607부터 일반적인 Win32 파일 및 디렉터리 함수에서 MAX_PATH 제한이 제거되었습니다. 그러나 새 동작에 옵트인해야 합니다.

새로운 긴 경로 동작을 사용하도록 설정하려면 다음 조건을 모두 충족해야 합니다.

  • 레지스트리 키 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.