MAX_PATH - 파일명 및 전체경로 길이 제한

2018. 6. 1. 16:27IT-개발/winapi 및 MFC

반응형


OS 마다 파일명 및 파일 전체경로 길이에 대한 제한이 다른것으로 인해


이기종 OS에서 파일을 다루(Create / Open / Rename)는 데에 여러가지 문제가 발생합니다.


여기서는 오로지 Window OS 에서의  MAX_PATH에 대해서만 이야기하려고 합니다.



프로그램을 개발할때에 MAX_PATH 라는 define을 흔히 사용하게 됩니다.


#define MAX_PATH 260

 

저도 이렇게 나오네요.


실제로 PC 사용하시는 분 중에 이 이름보다 큰 경로길이를 요구하는 파일이름을 사용할 만한 분들은 별로 없습니다만


나름대로 파일 관리하신다면서 길게 파일이름을 쓰면 260을 넘기는 일이 종종생갑니다.


결론 부터 말씀드리면 \\?\ 요 문자를 사용해서


c:\0123456789\ ....


이렇게 길게 되어 있는 경로에 prefix 를 붙여서


\\?\c:\0123456789\ ....  로


각종 파일 관련 api를 사용하면 문제없이 동작합니다. 하지만, 여기서도 제약이 있습니다.


\\?\c:\0123456789\ ....  처럼 단일 폴더 및 파일이름이 MAX_PATH를 넘을 수 없습니다.(정확히는 255)


그리고, unicode 지원하는 함수, CreateFileA 가 아니라 CreateFIleW 등으로 호출해야 된다고 하네요. 


이건 CreateFileA 로 Test를 해보지 않아서 모르겠지만 CreateFIleW는 확실히 되네요.



(Test하는데 사용한 예제)



        //////////////// Folder 초기화

        strPathFolder = strPath;

 

        int idx=0 ;

        for (idx=0 ; idx < 30 ; idx++)

        {

               strPathFolder += _T("0123456789");

               if (idx%9 == 0)

               {

                       strPathFolder += _T("\\");

               }

        }

 

        SetDlgItemText(IDC_EDIT_FOLDER, (LPTSTR)strPathFolder.GetBuffer(0));


............


        // Folder 생성

        CString strData = _T("");

        GetDlgItemText(IDC_EDIT_FOLDER, strData);

        SHCreateDirectoryExW(NULL, (LPTSTR)strData.GetBuffer(0) , NULL);



보다 좋은 예제와 참고한 Link들 입니다.


https://libsora.so/posts/dispatch-by-prefix/

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

https://www.experts-exchange.com/questions/21260104/Create-long-directory-path.html

https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363856(v=vs.85).aspx