Windows에서는 언제 "\\\\?\\" 파일 이름 접두사를 사용해야 합니까?
문제
유니코드 파일 이름이 지정된 파일을 열기 위한 C 라이브러리를 발견했습니다.파일을 열기 전에 먼저 "\\?\"를 추가하여 파일 이름을 경로로 변환합니다.경로에 허용되는 최대 문자 수를 늘리는 것 외에 이렇게 할 이유가 있습니까? 이 msdn 기사?
이러한 "\\?\" 경로에는 Windows API 및 표준 라이브러리의 유니코드 버전이 필요한 것 같습니다.
해결책
예, 단지 그 목적을 위한 것입니다.그러나 MAX_PATH 길이를 초과하는 경로를 생성하기로 결정하면 호환성 문제가 발생할 수 있습니다.예를 들어, 탐색기 셸과 명령 프롬프트(적어도 XP에서는 Vista에 대해서는 잘 모르겠습니다)는 해당 길이를 초과하는 경로를 처리할 수 없으며 오류를 반환합니다.
다른 팁
이 방법의 가장 좋은 용도는 새 파일을 만드는 것이 아니라 다른 사람이 만든 기존 파일을 관리하는 것입니다.
나는 정기적으로 파일을 가져오는 파일 서버를 관리했습니다. path_length > MAX_PATH
.알다시피, 사용자는 파일을 다음과 같이 보았습니다. H:\myfile.txt
, 하지만 서버에서는 실제로 H:\users\username\myfile.txt
.따라서 사용자가 정확히 다음과 같은 파일을 생성한 경우 MAX_PATH
캐릭터, 서버에서는 그랬어요 MAX_PATH+len("users\username")
.
(MAX_PATH 문자로 파일을 생성하는 것은 그리 드문 일이 아닙니다. Internet Explorer에서 웹 페이지를 저장할 때 페이지 제목을 파일 이름으로 사용하기 때문에 일부 페이지에서는 상당히 길 수 있습니다.)
또한 Mac 또는 Linux 시스템과 네트워크 또는 USB를 통해 드라이브를 공유하면 con, prn 또는 lpt1과 같은 이름의 파일을 찾을 수 있습니다.그리고 다시 말하지만, 접두어를 사용하면 사용자와 스크립트가 해당 파일을 처리할 수 있습니다.
가장 먼저 주목해야 할 것은 "? "는 경로를 UNC 경로로 만들지 않는다는 것입니다. 당신은 그것을 UNC라고 불렀을 때 두 번째로 더 정확했습니다.스타일 길. 그러나 그럼에도 불구하고, 유사성은 처음에 두 개의 백 슬래시를 갖는 것만으로도 발생합니다. 정말 UNC와는 아무 관련이 없습니다. 그것은 당신이 사용해야한다는 사실에 의해 백업됩니다. 더 나아가 "? "접두사로 UNC 경로를 얻는 문자.
나는 당신이 그 접두사를 사용해야 할 모든 이유가 있다고 생각합니다. 인용 한 기사에 설명 된대로 최대 길이 한계를 높이십시오. 그리고 그것은 유니 코드 경로에만 적용됩니다. 비공개 경로는 해당 접두사를 사용하여 한계를 피할 수 없습니다.
주목해야 할 한 가지는 접두사가 상대 경로에 대해서만 허용되지 않는다는 것입니다. C 라이브러리가 그 제한을 존중하는 것을 다시 확인할 수 있습니다.
더 긴 경로를 허용하는 것 외에도 "? "접두사를 사용하면 "Con"및 "Aux"와 같은 파일 및 디렉토리 이름을 사용할 수 있습니다. 일반적으로 Windows는 그것들을 구식 DOS 장치로 해석합니다.
나는 1995 년부터 Windows 코드를 작성해 왔으며, 그 접두사를 알고 있지만 그것을 사용할 이유를 찾지 못했습니다. 경로 길이를 너머로 증가시킵니다 MAX_PATH
그것의 유일한 이유 인 것 같습니다. 저와 제 프로그램의 고객도 그렇게 한 적이 없습니다.