2018. 6. 1. 16:27ㆍIT-개발/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
'IT-개발 > winapi 및 MFC' 카테고리의 다른 글
shlwapi - pathcreatefromurl (URL to FilePath) (0) | 2018.10.02 |
---|---|
Web에서 Agent 실행하기(1) - Custom URI (0) | 2018.09.11 |
[winapi] 자주쓰게되는 api들 모음 (0) | 2018.02.23 |
[DLL] (펌) 자신의 경로를 얻는 방법 (0) | 2018.02.23 |
(펌) Unicode Text 파일 만들기 (0) | 2018.02.23 |