itsource

Windows에서 260자 경로 길이 제한이 있는 이유는 무엇입니까?

mycopycode 2023. 4. 17. 21:49
반응형

Windows에서 260자 경로 길이 제한이 있는 이유는 무엇입니까?

저는 이 문제에 대해 몇 번인가 부적절한 순간에 부딪힌 적이 있습니다.

  • 딥 패스가 있는 오픈 소스 Java 프로젝트에서 작업하려고 합니다.
  • 소스 제어에 딥 Fitnesse Wiki 트리 저장
  • 바자를 사용하여 소스 제어 트리를 가져오는 동안 오류가 발생했습니다.

이 제한이 존재하는 이유는 무엇입니까?

왜 아직 제거되지 않았지?

경로 제한에 어떻게 대처합니까?또한 Linux 또는 Mac OS X로 전환하는 것은 이 질문에 대한 유효한 답변이 아닙니다.

이 기사를 인용합니다.https://learn.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

최대 경로 길이 제한

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

이제 1+2+256+1 또는 [drive][:\][path][path] = 260임을 알 수 있습니다.256은 DOS 일수부터의 적당한 고정 문자열 길이라고 생각할 수 있습니다.DOS API로 돌아가면 시스템이 드라이브당 현재 경로를 추적하고 있으며 최대 드라이브 수는 26개(기호가 있는 32개)이며 현재 디렉토리도 있습니다.

INT 0x21 AH=0x47은 "이 함수는 드라이브 문자와 초기 백슬래시 없이 경로 설명을 반환합니다."라고 말합니다.따라서 시스템은 CWD를 쌍(드라이브, 경로)으로 저장하고 사용자가 드라이브(1=A, 2=B, …)를 지정하여 경로를 묻는 것을 볼 수 있습니다. 0을 지정하면 INT 0x21 AH=0x15 AL=0x19에서 반환된 드라이브의 경로를 가정합니다.이 4바이트는 경로 문자열에 저장되지 않기 때문에 260바이트가 아닌 이유를 알 수 있습니다.

640K로 RAM이 충분하기 때문에 256바이트 경로 문자열이 필요한 이유.

NTFS 파일 시스템은 최대 32k자의 경로를 지원하므로 이는 엄밀하게 사실이 아닙니다.와 win32 api 를 할 수 .\\?\260자를 초과하는 경로 접두사를 사용합니다.

에서의 롱 패스에 대한 자세한 설명.Net BCL블로그
에서는 긴 하고 있습니다.

또 다른 우려 사항은 롱패스지원을 노출함으로써 발생하는 일관성 없는 동작입니다.「」를 한 롱 \\?\ API에서할 수 모든 prefix는 API에서 사용할 수 없습니다.예를 들어 모듈을 호출 프로세스의 주소에 매핑하는 LoadLibrary는 파일 이름이 MAX_PATH보다 길면 실패합니다.따라서 MoveFile을 사용하면 경로가 260자를 초과하는 위치로 DLL을 이동할 수 있지만 DLL을 로드하려고 하면 실패합니다.Windows API windows windows windows windows 。일부 회피책은 있지만 케이스 바이 케이스입니다.

문제는 왜 그 제한이 여전히 존재하는가 하는 것이다.확실히 최신의 Windows는, 다음과 같은 메리트가 있습니다.MAX_PATH더 긴 경로를 허용합니다.한한한 사라 ??? ??? ???

  • 제거할 수 없는 이유는 Windows가 절대 변경하지 않겠다고 약속했기 때문입니다.

계약을 가 API보다 긴 것을 모든 했습니다.260★★★★★★ 。

다음 올바른 코드를 고려하십시오.

WIN32_FIND_DATA findData;

FindFirstFile("C:\Contoso\*", ref findData);

Windows가 프로그램에 정보를 입력하도록 보장했습니다.WIN32_FIND_DATA★★★★

WIN32_FIND_DATA {
   DWORD    dwFileAttributes;
   FILETIME ftCreationTime;
   FILETIME ftLastAccessTime;
   FILETIME ftLastWriteTime;
   //...
   TCHAR    cFileName[MAX_PATH];
   //..
}

.MAX_PATH가 실행되었습니다Windows API가 실행되었습니다.내 애플리케이션은 그 정의된 값을 사용했다.

정의되어 , 할당되어 있을 이다.592, ,, 음, 음, 음, 음, 음, 음, 음, ,, ,, ,, ,, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, than260성격.Windows 에서는, 올바르게 애플리케이션을 작성하면, 향후에도 계속 동작한다고 약속했습니다.

가 Windows 보다 긴 을 허가하는 260기존 어플리케이션(올바른 API를 사용)에서 오류가 발생할 수 있습니다.

의 ,MAX_PATH항상, 우선 기존의 애플리케이션에 장애가 발생하지 않게 할 필요가 있습니다.예를 들어, 저는 Windows 3.11에서 실행되도록 작성된 Windows 응용 프로그램을 소유하고 사용하고 있습니다. Windows 64에서도 합니다.이것이 바로 이전 버전과의 호환성입니다.

Microsoft는 완전한 32,768개의 경로 이름을 사용하는 방법을 개발했지만 이를 위해 새로운 API 계약을 작성해야 했습니다.예를 들어 모든 파일이 하드 드라이브 또는 네트워크 공유에 있는 것은 아니기 때문에 Shell API를 사용하여 파일을 열거해야 합니다.

그러나 기존 사용자 애플리케이션을 손상시키지 않아야 합니다.대부분의 애플리케이션은 파일 작업에 셸 API를 사용하지 않습니다.다들 전화만 해FindFirstFile/FindNextFile늘은은그그그그그

Windows 10에서는 레지스트리 키를 수정하여 제한을 제거할 수 있습니다.

힌트 Windows 10 버전1607부터는 일반적인 Win32 파일 및 디렉토리 기능에서 MAX_PATH 제한이 없어졌습니다.단, 새로운 동작에 동의해야 합니다.

레지스트리 키를 사용하면 새로운 롱패스 동작을 활성화 또는 비활성화할 수 있습니다. , 를 「」로 합니다.HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled: (종류:REG_DWORD키의 값은 영향을 받는 Win32 파일 또는 디렉토리 함수에 대한 첫 번째 호출 후 시스템에 의해 (프로세스별로) 캐시됩니다(아래 목록).프로세스 라이프 타임 중에는 레지스트리 키가 새로고침되지 않습니다.키가 설정되기 전에 일부 프로세스가 시작되었을 수 있으므로 시스템의 모든 앱이 키의 값을 인식하려면 재부팅이 필요할 수 있습니다.는, 「Group 폴리시)」(URL)에도 제어할 수 있습니다.Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths또한 매니페스트를 통해 앱별로 새로운 롱패스 동작을 활성화할 수 있습니다.

<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>

폴더를 드라이브로 마운트할 수 있습니다. 라인에서 패스가 C:\path\to\long\folder 문자로 수 .X: 라이선스:

subst x: \path\to\long\folder

경로 제한에 대처하는 방법 중 하나는 심볼릭링크를 사용하여 경로엔트리를 단축하는 것입니다.

예를 들어 다음과 같습니다.

  1. C:\p
  2. mklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
  3. C:\p\foo 로 이동

PowerShell을 사용하여 긴 경로 이름을 사용하도록 설정할 수 있습니다.

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Type DWord -Value 1 

다른 버전은 에서 그룹 정책을 사용하는 것입니다.Computer Configuration/Administrative Templates/System/Filesystem:

그룹 정책 편집기

이것이 아직 존재하는 이유에 대해서는, MS는 이것을 우선시하지 않고, OS의 진보보다 하위의 호환성을 중시하고 있습니다(적어도 이 예에서는).

회피책으로는 사람이 읽을 수 있는 표준 버전이 아닌 경로 내의 디렉토리에 대해 "짧은 이름"을 사용하는 것입니다.를 들어,C:\Program Files\나는 사용할 것이다.C:\PROGRA~1\짧은 이름에 해당하는 것은 다음을 사용하여 찾을 수 있습니다.dir /x.

Windows 의 패스 사이즈 제한에 대처하는 방법에 대해서는, 7zip 를 사용해 패스 길이의 기밀 파일을 포장(및 언팩)하는 것이, 실행 가능한 회피책이라고 생각됩니다.몇 가지 IDE 설치(이클립스 플러그인 경로, 으악!)와 자동 생성된 문서 더미를 전송하는 데 사용했지만 지금까지 아무런 문제가 없었습니다.

(기술 PoV에서) Windows가 설정한 260 문자 제한을 어떻게 회피할 수 있는지 잘 모르겠습니다만, 동작하고 있습니다.

SourceForge 페이지에 대한 자세한 내용은 여기를 참조하십시오.

NTFS는 최대 32,000자의 경로 이름을 지원할 수 있습니다.

7-zip은 긴 이름도 지원합니다.

하지만 SFX 코드에서는 비활성화되어 있습니다.일부 사용자는 긴 경로를 사용하는 방법을 모르기 때문에 긴 경로를 좋아하지 않습니다.그래서 SFX 코드로 무효로 하고 있습니다.

및 릴리스 노트:

9.32 alpha 2013-12-01

  • 260자를 초과하는 파일 경로 이름에 대한 지원이 향상되었습니다.

4.44 베타 2007-01-20

  • 7-Zip은 260자를 초과하는 파일 경로 이름을 지원합니다.

중요: 이 작업을 올바르게 수행하려면 파일을 원하는 폴더에 드래그 앤 드롭하지 말고 7zip "Extract" 대화 상자에서 직접 대상 경로를 지정해야 합니다.그렇지 않으면 "Temp" 폴더가 임시 캐시로 사용되며 Windows 탐색기가 파일을 "최종 휴식처"로 이동하기 시작하면 동일한 260 문자 제한으로 되돌아갑니다.자세한 내용은 이 질문에 대한 답변을 참조하십시오.

어떤 이유로 디폴트이지만 다음 레지스트리 키로 쉽게 덮어쓸 수 있습니다.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

참조: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/

이 문제에 대처하는 또 다른 방법은 파일을 어떻게 처리하느냐에 따라 Cygwin을 사용하는 것입니다(즉, Cygwin 명령어가 고객의 요구에 적합한지 여부).

예를 들어 Windows 탐색기도 할 수 없는 파일을 복사, 이동 또는 이름을 변경할 수 있습니다.또는 물론 md5sum, grep, gzip 등의 내용도 취급합니다.

또한 코딩하는 프로그램의 경우 Cygwin DLL에 링크하여 긴 경로를 사용할 수 있도록 할 수 있습니다(아직 테스트하지 않았습니다).

언급URL : https://stackoverflow.com/questions/1880321/why-does-the-260-character-path-length-limit-exist-in-windows

반응형