1. CreateDirectory (A, W, ExA, ExW) (win api)
2. SHCreateDirectory (shell32.dll)
3. mkdir (crt )
여기서 잠시 봐야할 것이 한번에 여러 서브폴더를 포함하는 경로를 주었을 때, 2와 3은 생성되어 있지 않은 중간 디렉토리를 자동으로 생성해 주지만 1은 그렇지 않죠.
작업에 따라 다르겠지만 중간 폴더를 함께 생성해 주는 것이 꼭 필요할 때가 있습니다.
그간 작업의 성격상 crt 함수를 쓰지 않는 방향을 쓰다보니 2번 밖에 사용할 수가 없습니다.
2번의 문제점은.. 머.. 그닥 문제는 아닙니다만 헤더와 lib를 하나 더 링크해줘야 한다는 오버헤드가 있습니다.
(오버헤더라고 하니 뭐하지만, 단일 DLL로 제작하는데 이런저런 DLL들이 서로 링크되어 있는 건 모양새가 안 이쁘더라구요^^;)
이럴때 이도 저도 싫다면 아래와 같이 간단하게 만들어줄 수도 있습니다.
23 BOOL CreateDirectoriesW(LPCWSTR pszPath)
24 {
25 if ( CreateDirectoryW(pszPath, NULL) )
26 {
27 return TRUE;
28 }
29 else
30 {
31 int cnt = 0;
32 wchar_t del = '\\';
33 wchar_t out = 0x00;
34 wchar_t szT[MAX_PATH];
35
36 StringCchCopyW(szT, MAX_PATH, pszPath);
37 if ( szT[wcslen(szT)-1] == '\\' ) szT[wcslen(szT)-1] = out;
38
39 wchar_t* pBk = wcsrchr(szT, del);
40 BOOL bIsFolder = FALSE;
41
42 for(;!bIsFolder;pBk=wcsrchr(szT, del))
43 {
44 cnt++;
45 pBk[0] = out;
46 DWORD dwType = GetFileAttributesW(szT);
47 if ( dwType == INVALID_FILE_ATTRIBUTES ) bIsFolder = FALSE;
48 else if ( dwType & FILE_ATTRIBUTE_DIRECTORY ) bIsFolder = TRUE;
49 else bIsFolder = FALSE;
50 }
51
52 for(;cnt>0;cnt--)
53 {
54 pBk = wcschr(szT, out);
55 pBk[0] = del;
56 CreateDirectoryW(szT);
57 }
58 }
59
60 DWORD dwAttr = GetFileAttributesW(pszPath);
61 if ( dwAttr == INVALID_FILE_ATTRIBUTES ) return FALSE;
62 else if ( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) return TRUE;
63 else return FALSE;
64 }
P.S. 아무튼 shell32.dll 에는 Path~ 류의 유용한 패스 관련 함수가 다양하게 많이 존재 합니다. 아래와 같이 필요할 때 간간히 써먹을 만한게 많죠
함 수 명 |
인 자 |
결 과 |
PathAddBackslash |
c:\path1 |
c:\path1\ |
PathBuildRoot |
0 |
A:\ |
PathCanonicalize |
c:\path1\..\.\path1 |
c:\path1 |
PathCompactPath |
c:\path1\path2\path3\file.txt |
c:\path1\...\file.txt |
PathFileExists |
c:\path1\file.txt |
파일의존재유무[T/F] |
PathFindFileName |
c:\path1\path2\file.txt |
file.txt |
PathIsDirectory |
c:\path1\path2 |
디렉토리유무[T/F] |
PathIsfileSpec |
file.txt |
순수파일이름인지[T/F] |
PathMakePretty |
C:\PATH1\FILE.TXT |
C:\path1\file.txt |
PathIsNetworkPath |
\\YHKim\path1\file.txt |
네트워크경로인지[T/F] |
PathIsRoot |
c:\ |
루트경로인지유무[T/F] |
PathIsSystemFolder |
c:\windows\System32 |
시스템폴더인지유무[T/F] |
PathRemoveBackslash |
c:\path1\path2\ |
c:\path1\path2 |
PathRemoveBlanks |
“ c:\path1\path2 “ |
“c:\path1\path2” |
PathRemoveExtension |
c:\path1\path2\file.txt |
c:\path1\path2\file |
PathRemoveFileSpec |
c:\path1\path2\file.txt |
c:\path1\path2 |
PathRenameExtension |
c:\path1\path2\file.txt |
c:\path1\path2\file.changed |
PathStripPath |
c:\path1\path2\file.txt |
file.txt |