NTFS는 약 32,000 자 길이의 경로를 허용하지만 Win32 API의 경로 길이 제한은 259 자 입니다.
Windows API ([링크 된 문서]에 설명 된 일부 예외)에서 경로의 최대 길이 MAX_PATH
는 260 자입니다.
(추가로가 NULL
우리에게 259 개 사용할 수있는 문자를주는 경로에 추가 종료 문자.)
탐색기 (및 거의 모든 다른 Windows 앱)는 파일 시스템 액세스를 위해 Win32 API를 사용하기 때문에 가능 하더라도 이러한 제한을 극복하는 것은 실용적이지 않습니다 .
Windows API에는 최대 총 경로 길이 32,767 자에 대한 확장 길이 경로를 허용하는 유니 코드 버전이있는 많은 기능이 있습니다. 이 유형의 경로는 백 슬래시로 구분 된 구성 요소로 구성되며, 각 함수 의 lpMaximumComponentLength
매개 변수에 반환 된 GetVolumeInformation
값까지이 값이 사용됩니다 (이 값은 일반적으로 255 자임). 확장 길이 경로를 지정하려면 "\\? \"접두사를 사용하십시오. 예를 들어 "\\? \ D : \ very long path "입니다.
불행히도 \\?\D:\very long path
탐색기 창에 입력 할 수는 없습니다 . 애플리케이션은 이러한 API를 활용하고 매우 긴 경로 이름을 처리하도록 설계되어야합니다.
Windows에서 확장 길이 경로에 액세스하는 한 가지 방법은 Windows 용 * nix 에뮬레이션 계층 인 Cygwin 을 설치 하는 것입니다. 내 테스트에서 Cygwin은 다음에 의해 제한되지 않는 것으로 보입니다 MAX_PATH
. bash와 vi는 2,000 자 길이의 경로에 문제가 없었습니다.
bash를 사용하여 확장 된 경로를 찾아 볼 수는 있지만 일반 Windows 응용 프로그램에서는 해당 경로의 파일을 열 수 없습니다. 예를 들어, notepad
작업 디렉토리가 확장 길이 경로 인 동안 입력 하면
오류 : 현재 작업 디렉토리에 Win32 작업 디렉토리에 허용 된 경로보다 긴 경로가 있습니다. 여기에서 기본 Windows 애플리케이션을 시작할 수 없습니다.
노력하는 것도 효과 notepad "\\?\D:\very long path\file.txt"
가 없습니다. 시작하지만 "파일을 찾을 수 없습니다 ..." 라고 표시됩니다. 메모장 ++ 에서 동일하게 시도하면 충돌이 발생합니다. (아마 버퍼 오버 플로우 일 수 있습니다.)
확장 길이 경로에 깊이 묻혀있는 특정 파일에 액세스하는 다른 옵션 은 NTFS 연결 지점 을 만들어 경로 자체 를 줄이는 것 입니다. 관리자 권한 명령 프롬프트에서 :
D:\> mklink /J jct "\\?\D:\very\long\path"
D:\very\long\path\
에서 의 내용에 액세스 할 수 있습니다 D:\jct\
. 익스플로러 및 기타 앱과 관련하여 경로가 단지 D:\jct\
(또는 무엇이든) 있기 때문에 경로 길이 문제가 발생하지 않습니다 . NTFS 드라이버는 경로 ( "재분석 지점")를 투명하게 리디렉션합니다.
이 접근 방식의 단점은 액세스하려는 파일 근처에 접합을 만들어야한다는 것입니다. 여전히 전체 디렉토리 구조를 탐색 할 수는 없습니다.
특수 문자 ( " * : < > ? \ |
) 와 관련하여 이는 간단합니다. 이러한 문자는 Windows에서 특별한 의미를 가지므로 경로 내에서 사용할 수 없습니다. (Cygwin을 사용하면 특수 문자로 파일을 작성할 수 있지만 특수 유니 코드 문자로 문자 를 대체하여 읽을 수 있습니다. Linux 또는 탐색기에서 Cygwin으로 작성된 파일을 보는 것은 올바르지 않습니다. 유니 코드 문자는 대체되지 않습니다.)
그 모든 것이 말했듯이, 당신은 무엇을하고 있습니까? 아마도 당신이하고있는 일을 재평가하고 긴 길을 피함으로써 인생을 더 쉽게 만들 수있을 것입니다. 기회는 당신이있는 그 긴 어쨌든 경로가 필요하지 않습니다 .