Programming/C, C++, MFC

하위폴더 포함, 폴더 전체를 복사하자

매직블럭 2020. 11. 10. 09:55

하위폴더 및 파일들을 포함한 폴더를 다른 경로로 전체 복사하고 싶은 경우가 있다.

 

이럴 경우 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;
}