보통 디렉토리를 생성하기 위해 사용하는 API 류는 아래와 같습니다.

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

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기