2010년 9월 8일 수요일

Windows 에서 폴더 및 파일의 전체 경로 길이






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





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





WinDef.h 파일에 정의된 MAX_PATH







stdlib.h 파일에 정의된 _MAX_PATH










 조금만 관심을 갖고 찾아 봤다면 알 수 있겠지만 260 길이 안에는 "드라이브 이름 + 폴더 이름 + 파일 이름 + NULL문자"  를 모두 합한 길이이다. 마지막 NULL 문자는 문자열을 구분하기 위해 사용되는 값이니 실질적으로는 259 길이의 경로를 사용하게 된다. 








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





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







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








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





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







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








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





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







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








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







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





댓글 2개:

  1. 저는 토렌토에서 파일을 받다보니 저 길이를 넘는 폴더가 만들어졌습니다.
    그러더니 지워지지도않더군요.
    Unlocker라는 프로그램으로 강제삭제하려고 보니 Unlocker라는 프로그램이 죽어보리고;;
    문제가 되는 폴더에는 들어가지지도 않고 이름도 변경이 안되고 지워지지도 않습니다.
    커맨드창(cmd)에서 del 명령으로 지우려해도 전혀 지워지지가 않구요;;
    혹시 이럴땐 어떻게해야 하는지 아시나요?

    답글삭제
  2. 저 길이가 넘는 폴더가 만들어졌나요?! 음... 하긴 토렌트 마그넷 주소로 파일 받다 보면 폴더 이름도 길고, 폴더도 중첩되서 만들어 지더군요. 음... 일단 안전모드로 들어가서 삭제 시도해 보세요~

    답글삭제