하위폴더 및 파일들을 포함한 폴더를 다른 경로로 전체 복사하고 싶은 경우가 있다.
이럴 경우 SHFileOperation 를 이용하여 복사를 수행하자.
int CopyFolder(CString szFrom, CString szTo)
{
SHFILEOPSTRUCT shfo;
int nRet;
char* pszFrom = new char[szFrom.GetLength() + 1];
char* pszTo = new char[szTo.GetLength() + 1];
strcpy(pszFrom, szFrom);
strcpy(pszTo, szTo);
ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT));
shfo.hwnd = AfxGetMainWnd()->m_hWnd;
shfo.wFunc = FO_COPY;
shfo.pFrom = pszFrom;
shfo.pTo = pszTo;
shfo.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMMKDIR;
shfo.lpszProgressTitle = NULL;
nRet = SHFileOperation(&shfo);
delete[] pszFrom;
delete[] pszTo;
return nRet;
}
이유는 아직 확인 못했지만 위 방법이 사용중 오류가 발생하는 경우가 있어서 아래 방법으로 대체하여 사용 중 (20.11.20. 기준)
int CopyFolder(CString szFrom, CString szTo)
{
HANDLE hSrch;
WIN32_FIND_DATA wfd;
BOOL bResult = TRUE;
TCHAR WildCard[MAX_PATH];
TCHAR SrcFile[MAX_PATH];
TCHAR DestFile[MAX_PATH];
wsprintf(WildCard, "%s\\*.*", szFrom);
CreateDirectory(szTo, NULL);
hSrch = FindFirstFile(WildCard, &wfd);
if (hSrch == INVALID_HANDLE_VALUE)
return FALSE;
while (bResult) {
wsprintf(SrcFile, "%s\\%s", szFrom, wfd.cFileName);
wsprintf(DestFile, "%s\\%s", szTo, wfd.cFileName);
// 서브 디렉토리가 발견되면 서브 디렉토리를 복사한다.
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (lstrcmp(wfd.cFileName, ".") && lstrcmp(wfd.cFileName, "..")) {
CopyFolder(SrcFile, DestFile);
}
}
else {
CopyFile(SrcFile, DestFile, FALSE);
}
bResult = FindNextFile(hSrch, &wfd);
}
FindClose(hSrch);
return TRUE;
}
'Programming > C, C++, MFC' 카테고리의 다른 글
특정주소가 폴더(디렉토리)인지 파일인지 확인하자 (0) | 2021.02.04 |
---|---|
MFC Dialog 에서 enter, esc 동작을 제어하자 (0) | 2020.11.10 |
std::string에서 format을 사용하자 (2) | 2020.03.19 |
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우 (0) | 2019.07.09 |
Unicode 환경에서 한글이 깨질경우 해결방법 (0) | 2019.03.11 |