[WinAPI] 디렉토리(폴더) 생성, CreateDirectory

Windows 에서 폴더 생성을 하는 코드를 만드려면 총 3개 함수를 알아야 합니다.

첫번쨰는 CreateDirectory
BOOL CreateDirectoryA(
  LPCSTR                lpPathName,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

하지만 해당 함수는 만드려는 경로 중간에 폴더가 없다면 생성 되지 않습니다.

  • ex) C:\Directory1\Direct2\Directory3에서 Direct2가 없다면 Direct3은 생성되지 않습니다.

그래서 토큰방식으로 문자열을 분석해서 폴더 위치마다 다음 폴더가 있는지 알아야 합니다.

두번째 AbstractSubString
BOOL AFXAPI AfxExtractSubString (
    CString& rString,
    LPCTSTR lpszFullString,
    int iSubString,
    TCHAR chSep  = '\n');
세번째 GetFileAttributes, 파일 존재 여부를 확인한다.
DWORD GetFileAttributesA(
  LPCSTR lpFileName
);

INVALID_FILE_ATTRIBUTES를 반환하면 폴더가 없습니다.

전체 코드는 아래와 같습니다.

void CMFCApplication1Dlg::OnBnClickedOk()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	UpdateData( TRUE );

	CString sMakePath( _T("C:\\Directory1\\Direct2\\Directory3") );

	CString sDirectory(_T(""));
	CString sCheckPath(_T(""));
	int iPos = 0;
	while ( ::AfxExtractSubString( sDirectory, sMakePath, iPos++, _T('\\') ) )
	{
		if ( _T( "" ) == sCheckPath )	// 맨 처음만 처리
			sCheckPath = sDirectory;
		else
			sCheckPath = sCheckPath + _T( "\\" ) + sDirectory;

		if (  INVALID_FILE_ATTRIBUTES == ::GetFileAttributes( sCheckPath ) ) // 폴더 확인
		{
			BOOL bCreate = ::CreateDirectory( sCheckPath, NULL ); // 폴더 생성
			if ( !bCreate )
			{
				// 에러 시 메시지 출력, 종료
				CString sMsg;
				sMsg.Format(  _T("Create Directory Fail(%s)"), sCheckPath );
				AfxMessageBox( sMsg );
				break;
			}
		}
	}
}