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;
}
}
}
}