윈도우 파일길이 제한 (퍼옴)

2015. 6. 1. 20:59IT-OS/Window

반응형

윈도우(Windows)에서 폴더명과 파일명의 최대 길이는? (퍼옴)


윈도우(Windows)에서 파일명이나 폴더명으로 사용할 수 있는 글자수의 길이는 최대 얼마나 될까?

주위에 프로그램하는 사람들에게 물어보면 대개 255 글자로 알고 있는 경우가 많다.

 

탐색기에서 아래와 같이 루트 폴더 밑에 '임시'라는 이름의 폴더를 하나 만들고 그 밑에 다시 폴더 이름으로 숫자를 써넣어 몇 글자까지 들어가는지 확인해 보자.  윈도우(Windows) 8.1의 탐색기에서 '1234567890'의 10 글자를 입력하고 이를 복사하여 계속 25번쯤 붙여넣기한 그림이다.

 


 

241 글자를 끝으로 더 이상 입력되지 않는다.

이번에는 루트 폴더 바로 밑에 위와 같은 방법으로 폴더 이름을 길게 해보자.

 


 

어라? 이번에는 241 글자가 아니라 244 글자까지 입력된다.

여기서 짐작할 수 있듯이 상위 폴더의 글자수에 따라 사용할 수 있는 폴더의 글자수가 다름을 알 수 있다.

무슨 원칙이 있는 걸까 아니면 '그때 그때 달라요' 일까?

 

상위 폴더의 글자수를 달리해 가며 하위 폴더를 만들어 보면 상위 폴더의 글자수가 길면 하위 폴더에 쓸 수 있는 폴더명의 글자수가 짧다.

그렇다면 위에서 루트 폴더 밑에 만든 244 글자의 폴더와 '임시' 폴더 밑에에 만든 241 글자의 차이인 3글자는 어디서 온 걸까?

244 글자 폴더의 상위 폴더 경로는 'C:\'이고 241 글자 폴더의 상위 경로는 'C:\임시\'이므로, '임시\'의 3글자 만큼 차이가 있음을 알 수 있다.

 

이번에는 메모장을 실행하고 루트 폴더에 아래와 같이 두개의 파일을 저장해둔다.

 


 

위 그림에서 '1234567.txt' 파일을 복사하여 같은 루트 폴더에 바로 ​붙여넣기 해보자.

'1234567 - 복사본.txt'과 같은 파일이 하나 만들어졌을 것이다.

'이름 바꾸기'를 이용하여 '1234567890' 숫자를 계속 써넣어(복사와 붙여넣기) 몇글자까지 입력할 수 있는지 보자.

'1234567890...1.txt'(...은 너무 길어서 생략)과 같이 255 글자까지 입력할 수 있다.

이번에는 위 그림에서 '1234567.txt' 파일을 좀 전에 루트 폴더 밑에 만들어 둔 244 글자의 '1234567890...1234' 폴더 밑에 복사해보자(복사 - 붙여넣기). 복사가 된다.

다음으로 '12345678.txt' 파일을 복사하고 붙여넣기 해보자. 다음과 같은 메시지가 뜨고 복사가 안된다.

 


 

파일명이 불과 12 글자 밖에 안되는데 너무 길다고 한다.

 

위 메시지에서 '파일 이름을 줄여서 다시 시도하거나 경로가 짧은 위치에서 사용해 보십시오'라는 말로 유추해 보면,

결국 쓸 수 있는 파일명의 글자수는 폴더 이름의 글자수에 따라 다름을 알 수 있다.

 

즉, 파일명과 폴더의 전체 경로 이름을 합한 글자수에 제한이 있다는 얘기다.

파일이나 폴더 하나 하나에 대한 제한이 아니라 아래와 같이 전체 경로를 포함한 파일명의 길이에 제한이 있다.

 

C:\임시1\임시23\임시456\가나다라ABC1234567890.txt

​ 

따라서 윈도우(Windows)에서 파일명의 허용 길이는 해당 파일이 저장되어 있는 폴더 위치의 전체 경로 글자수에 따라 다르다.

 

윈도우(Windows)에서 C/C++ 프로그래머에게는 익숙한 미리 지정된 'MAX_PATH'라는 상수가 있다.

이것이 실제로 정의되어 있는 헤더(.h) 파일을 찾아보면 다음과 같이 나온다.

 

#define MAX_PATH    260 

위의 의미는 폴더의 전체 경로를 포함한 파일명의 최대 길이는 끝에 널(Null) 값을 제외하고 259 글자라는 얘기다.

 

위에서 '1234567.txt'는 복사되고 '12345678.txt'는 복사가 안되었던 이유는 계산해보면 나온다.

전체 경로가 'C:\1234567890...1234\1234567.txt'이므로 아래와 같이 전체 경로를 포함한 파일명은 259 글자이다.

 

C:\ -> 3 글자

1234567890...1234 -> 244 글자 (...은 너무 길어서 생략한 것)

\ -> 1 글자

1234567.txt -> 11 글자

 

3 + 244 + 1 + 11 = 259

이제 ​결론을 정리해보자.

 

1. 폴더명은 전체 경로를 포함하여 최대 247 글자이며, 루트 폴더에 가장 긴 244 글자의 폴더를 만들 수 있다.

2. 파일명은 전체 경로를 포함하여 최대 259 글자이며, 루트 폴더에 가장 긴 255 글자의 파일을 만들 수 있다.

따라서 파일 하나의 이름 길이는 최대 255 글자로 알고 프로그래밍 하는 것은 맞다.

 

​그런데 엑셀이나 워드와 같은 MS의 오피스 프로그램에서는 직접 파일을 저장할 때 이 보다 더 글자수가 작게 파일명을 제한하기도 한다.

 

이런 제한 때문에 일부 브라우저에서 한글 이름으로 되어 있는 엑셀 파일 다운로드 시 저장하지 않고 바로 '열기'를 선택 할 경우, '파일이름의 철자와 파일위치가 정확한지 확인하십시오'와 같은 오류가 발생하여 열지 못하는현상을 경험한 사람이 많을 것이다.

 

이것은 보통 사용자가 따로 지정하지 않으면 다운로드한 파일이 임시로 저장되는 인터넷 임시 폴더가 아래의 예와 같이 길 뿐더러

 

C:\Users\HongGilDong\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\GPUUMA60\

 

한글 한글자가 '%AB%CD'와 같이 6글자로 저장되어 제한된 전체 길이를 초과하기 때문이다.

 

이런 문제로 그룹웨어와 같은 업무용 프로그램에서는 언제든 파일을 확실히 열 수 있게 하기 위해, 파일 다운로드에도  웹표준을 사용하지 않고 ActiveX를 쓰기도 한다. 

 

한가지 이상한 것은 메모장에서 직접 파일을 저장해보면 위의 제한을 초과해서도 저장된다는 점이다.

이쯤되면 '그때 그때 달라요'가 맞다고 해야 하나.



일반적으로는 260 제한이긴 하지만, 개발자가 원한다면 32,767 글자까지 가능합니다. 이런 경우 개발자가 파일 관련 함수에 경로를 "\\?\" 접두사와 함께 전달해야 합니다.


Naming Files, Paths, and Namespaces

; http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx


메모장의 경우 제한을 초과해서 저장이 되었다는 것은 경로처리를 그렇게 했기 때문일 수 있습니다. (즉, 메모장도 32,767 이상의 문자열 경로에서는 오류가 발생할 것입니다.)