파일 경로의 최대 유효 길이가 무엇인지 이해하려고 노력합니다.
이를 위해 Windows 7의 기본 Windows 파일 관리자와 다음 PowerShell 스크립트를 사용합니다.
Get-ChildItem | Select Name, FullName, @{N="Path Length";E={$_.FullName.Length}} | Format-List
관리자를 열고 abc.txt
에서 파일을 만든 C:\
다음 abc
파일 관리자가 허용하는 한 문자를 추가합니다. (실제로 저는 물론 복사해서 붙여넣기를 사용합니다. 이게 훨씬 빠릅니다.)
C:\aaa
그런 다음 및 에서 동일한 테스트를 수행합니다 C:\aaa\bbb
.
어떤 이유에서인지 결과가 다릅니다. C:\aaa
및 의 최대 길이 C:\aaa\bbb
는 259자이지만 의 최대 길이 C:\
는 258자입니다. 왜?
C:\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
258 characters
C:\aaa\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcde.txt
259 characters
C:\aaa\bbb\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_a.txt
259 characters
업데이트
mail-archive.com의 Python 목록:
(https://www.mail-archive.com/[이메일 보호됨]/msg444514.html)
기존 DOS 경로 길이 제한(예: 상황에 따라 247, 258 또는 259자)
아래 설명은 제가 한 것입니다.
247은 디렉토리 경로의 최대 길이를 나타냅니다: 260 - 12 - 1 = 247. 여기서 12는 8.3 파일 이름을 나타내고 1은 NUL 종결자를 나타냅니다. 예를 들어, C:\foo
또는C:\foo\bar
259는 경로의 최대 길이를 나타냅니다.파일(디렉토리가 아님) 위치~ 아니다드라이브의 루트에 있습니다. 예를 들어,C:\foo\aaa.txt
258은 경로의 최대 길이를 나타냅니다.파일(디렉토리가 아님) 위치~에드라이브의 루트. 예를 들어,C:\aaa.txt
따라서 실제로는 247, 258, 259의 3가지 제한이 있습니다.
그런데 왜 드라이브 루트에 있는 파일에는 258개, 다른 디렉토리에 있는 파일에는 259개로 제한됩니까?
또한보십시오:https://www.mail-archive.com/[이메일 보호됨]/msg106171.html
MAX_PATH는 파일 경로를 259자로 제한합니다(종료 null 제외). 현재 디렉터리는 258자입니다(뒤에 백슬래시와 null이 없습니다). 새 디렉토리의 경로는 247자입니다(8.3 파일 이름을 위한 공간을 남겨두려면 259에서 12를 뺍니다).
그러나 두 번째 인용문은 나에게 이해가 되지 않습니다. 이 사람이 후행 백슬래시에 대해 말하는 이유를 이해할 수 없습니다. 후행 백슬래시는 파일이 아닌 디렉터리에 대해 이야기할 때 해당될 수 있습니다!
답변1
차이점에 대한 간단한 설명이 있습니다. Windows 7의 잘못된 코드, Windows 10에서 새로 작성되었습니다. 아래에서는 제가 그렇게 생각하는 이유와 Windows 7과 10 모두에서 파일 이름 길이에 대한 규칙이 무엇인지 보여 드리겠습니다.
하지만 먼저 작은 언급을 하겠습니다. 260의 한계는 다음과 같습니다. MAX_PATH 훨씬 이전 Windows 버전의 아티팩트입니다. Windows API는 예를 들어 다음과 같은 데이터 구조에서 이를 많이 사용하기 때문에 변경할 수 없습니다. WIN32_FIND_DATA, API에서 이 값을 늘리면 기존 애플리케이션에서 메모리 오버런이 발생합니다. 이것이 바로 긴 파일 이름이 명시적으로 허용되어야 하는 이유입니다. 기재 프로그램은 매니페스트에서 긴 이름을 처리하는 기능을 선언해야 합니다.
또한 드라이브 문자( C:\
)는 텍스트에만 포함되며 Windows 디스크 테이블(MFT)과 관련이 없습니다. Windows는 파일이 어떤 디스크에 있는지 잘 알고 있습니다.
다음은 Windows 7에서의 테스트입니다. 여기서 내 결과는 포스터의 결과를 확증합니다.
다음과 같은 규칙을 도출할 수 있습니다.
- 드라이브 문자가 한도 계산에 포함되지 않습니다(
C:
). - 선행 백슬래시는 한계 계산에 포함되지 않습니다(
C:\
). - 나머지는 중간 백슬래시를 포함하여 256자로 제한됩니다.
- 루트 파일은 최대 255자까지 가능하지만 폴더의 파일은 이를 수행할 수 없습니다.
이러한 무의미한 결과는 잘못 작성된 코드의 방향을 강력하게 지적합니다.
우선, MFT에 관한 한 각 경로 구성 요소는 분리되어 있으며 다른 구성 요소(하위 폴더)와 길이 제한이 정확히 동일하므로 길이를 제한하기 위해 디스크 테이블에 내재된 이유가 없습니다. 파일 이름이 일부 폴더에 포함되어 있기 때문입니다.
둘째, 루트 파일이 루트 파일의 경로에 있는 유일한 요소이기 때문에(256자에 도달할 수 있음을 보았기 때문에) 루트 파일이 256자여야 하는 것처럼 보이는데 왜 255자로 제한되는지에 대한 질문이 있습니다.
설명을 검색하면서 저는 255가 Microsoft에서 결정한 파일 이름의 실제 제한이고 나머지는 실제로 잘못 작성된 코드일 뿐이라는 이론을 세웠습니다.
이 이론을 검증하기 위해 Windows 10의 동작을 확인하기 위해 테스트했습니다. 아래에서 동일한 작업을 반복했습니다(에 쓰는 데 관리자 권한이 필요함 C:\
).
위에서 볼 수 있듯이 여기의 동작은 훨씬 더 논리적입니다. 경로의 중간 구성 요소는 더 이상 파일 이름의 크기를 제한하는 데 계산되지 않으며 항상 255자입니다.
255자의 파일 이름을 허용하는 것이 Microsoft의 의도임이 분명해졌지만 Windows 7에서는 경로를 고려한 코드에 의해 비활성화되었으며 아무런 이유도 없었습니다.
추가 조사를 통해 NTFS에 대한 문서를 발견했습니다. 속성 - $FILE_NAME(0x30), 파일 이름 길이(오프셋 0x40)에 대해 1바이트를 지정합니다. 이는 255자 제한을 잘 설명합니다. (또한 FireEye 참조 2부: 파일 이름 속성의 내부 구조).
작은 일화: 마이크로소프트 버그 보존법에 따르면, 윈도우 10 탐색기는 , , 의 255자 파일을 삭제할 수 없었다 C:\
. 그것들을 제거하려면 명령 프롬프트에 명령을 입력해야 했습니다 . (다른 버그를 소개하면서 하나의 버그를 수정합니다...)C:\Temp
C:\Temp\abc
del 12*
답변2
어떤 이유에서인지 결과가 다릅니다. C:\aaa 및 C:\aaa\bbb의 최대 길이는 259자이지만 C:\의 최대 길이는 258자입니다. 왜?
귀하가 요구하는 것은 일반적으로 Windows 탐색기에서 허용되는 경로의 최대 길이입니다. 260자입니다.
이는 경로에 248자와 12자를 허용하는 파일 이름을 허용합니다.
Null 문자로 인해 예제 파일의 이름이 다릅니다.
Windows 10 버전 1607 이전의 Windows 버전에서 경로의 최대 길이는 260자로 정의된 MAX_PATH입니다. 이후 버전의 Windows에서는 제한을 제거하려면 레지스트리 키를 변경하거나 그룹 정책 도구를 사용해야 합니다.
Windows API(다음 단락에서 설명하는 일부 예외 제외)에서 경로의 최대 길이는 260자로 정의되는 MAX_PATH입니다. 로컬 경로는 드라이브 문자, 콜론, 백슬래시, 백슬래시로 구분된 이름 구성 요소 및 종료 null 문자 순서로 구성됩니다. 예를 들어, 드라이브 D의 최대 경로는 "D:\some 256자 경로 문자열"입니다. 여기서 ""는 현재 시스템 코드 페이지에 대한 보이지 않는 종료 널 문자를 나타냅니다. (여기서 < > 문자는 시각적 명확성을 위해 사용되었으며 유효한 경로 문자열의 일부가 될 수 없습니다.)
원천:
답변3
고려해야 할 두 가지 제한이 있습니다. 하나는 최대 경로 길이이고 다른 하나는 최대 파일 이름 길이입니다. NTFS에서는파일 이름에는 최대 255개의 UTF-16 코드 포인트가 포함될 수 있습니다., 널 바이트 없음(12페이지 참조).
abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
길이는 정확히 255자입니다.