Windows 프로그래밍을 하면서 폴더 및 파일의 전체 경로를 설정할 때 덩그러니 TextBox 하나 두고 테스트 하였다. 뭐.. 지금까지는 급한 개발기간이였으니 그렇다 치더라도 이제는 입력값의 유효성을 체크하는 코드를 추가해야 겠다. 

  폴더 및 파일 의 전체 경로 이름의 제한 길이가 있다. 전체 경로 길이는 260자로 제한된다.

WinDef.h 파일에 정의된 MAX_PATH


stdlib.h 파일에 정의된 _MAX_PATH



 _MAX_PATH 260 길이 안에는 "드라이브 이름 + 폴더 이름 + 파일 이름 + NULL문자"  를 모두 합한 길이이다. 마지막 NULL 문자는 문자열을 구분하기 위해 사용되는 값이니 실질적으로는 259 길이의 경로를 사용하게 된다. 


폴더 이름의 최대 길이는 248?!

위에서 MAX_PATH 의 값이 260 이라 하여 폴더 이름의 길이가 260인 폴더를 만들 수 는 없다. 실제로 폴더를 만들어 보면, "0123456789 " 라는 문자열로 26번 반복해서 폴더 이름을 만들었다. 만드는 순간 어떠한 경고도 없기에 잘 만들어졌나 싶지만 실제로 길이를 확인해 보면 244 길이를 갖는 폴더가 만들어 진다.


폴더 생성을 C:\ 하위에서 했기 때문에 폴더의 전체 경로 앞부분에는 C:\ 가 붙는다. C:\ 문자열은 길이가 4 이므로 ("\"를 출력하기 위해선 "\\" 를 사용하므로) 폴더 이름의 최대 경로는 248이 된다.


최대 폴더 이름을 갖는 폴더의 하위 폴더 생성

위에서 생성한 폴더 하위에서 폴더를 생성하려 하면 Windows 에서 다음과 같은 오류 메시지를 출력하며 폴더 생성을 막는다. 


따라서, 최대 폴더 이름을 갖는 폴더에서는 하위 폴더를 생성할 수 없다.


최대 폴더 이름을 갖는 폴더의 하위 파일 생성

위에서 생성한 폴더 하위에서 파일을 추가하면.. 생각에는 하위 폴더 생성처럼 파일 생성을 막을 줄 알았지만 파일은 생성이 된다. 하지만 파일의 확장자를 포함한 파일 이름의 길이는 11자까지만 만들 수 있다.


최대 이름의 폴더를 생성할 때, Windows 차원에서 파일은 생성할 수 있도록 배려(?!)를 해준듯 하다. 폴더안에 아무것도 담을 수 없다면 그건 폴더 존재의 가치가 없으니까.


어째든 [드라이브명] [폴더 이름] [파일 이름] 을 합친 전체 경로는 260자를 넘길 수 없다.



※ C# 에서 위 규칙을 어기고 코딩하였을 경우 다음과 같은 예외 메시지가 발생한다.




※ Windows에서 파일 및 폴더 경로의 최대 길이를 제한하고 있지만 짜증(?!)나게 260을 넘는 경로로 만들 수 있다. 이렇게 될 경우 해당 파일에 대해 복사나 이름 변경을 윈도우에서 제한하긴 한다.
이런 파일들에 대해 Win32API를 사용하면 실패를 리턴한다. UNC 경로(\\?\)를 이용하면 비정상적으로 긴 경로에 대해서도 Win32API함수가 제대로 동작한다.


출처: http://six605.tistory.com/477 [As time goes by]