実装方法としては、
・ディレクトリの中のファイルをコピーする処理を作成する方法
・シェル関数を用いる方法
の2つの実現実装方法があります。
API版
BOOL CopyDirectory( LPCTSTR lpExistingDirectoryName,
LPCTSTR lpNewDirectoryName )
{
// 入力値チェック
if( NULL == lpExistingDirectoryName
|| NULL == lpNewDirectoryName )
{
return FALSE;
}
// ディレクトリ名の保存(終端に'\'がないなら付ける)
TCHAR szDirectoryPathName_existing[_MAX_PATH];
_tcsncpy_s( szDirectoryPathName_existing, _MAX_PATH, lpExistingDirectoryName, _TRUNCATE );
if( '\\' != szDirectoryPathName_existing[_tcslen(szDirectoryPathName_existing) - 1] )
{ // 一番最後に'\'がないなら付加する。
_tcsncat_s( szDirectoryPathName_existing, _MAX_PATH, _T("\\"), _TRUNCATE );
}
TCHAR szDirectoryPathName_new[_MAX_PATH];
_tcsncpy_s( szDirectoryPathName_new, _MAX_PATH, lpNewDirectoryName, _TRUNCATE );
if( '\\' != szDirectoryPathName_new[_tcslen(szDirectoryPathName_new) - 1] )
{ // 一番最後に'\'がないなら付加する。
_tcsncat_s( szDirectoryPathName_new, _MAX_PATH, _T("\\"), _TRUNCATE );
}
if( -1 == _taccess( szDirectoryPathName_existing, 0 ) )
{
return FALSE;
}
if( 0 == _tcsicmp( szDirectoryPathName_existing, szDirectoryPathName_new ) )
{
return FALSE;
}
// 新たなディレクトリの作成
CreateDirectory( szDirectoryPathName_new, NULL );
// ディレクトリ内のファイル走査用のファイル名作成
TCHAR szFindFilePathName[_MAX_PATH];
_tcsncpy_s( szFindFilePathName, _MAX_PATH, szDirectoryPathName_existing, _TRUNCATE );
_tcsncat_s( szFindFilePathName, _T("*"), _TRUNCATE );
// ディレクトリ内のファイル走査開始
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile( szFindFilePathName, &fd );
if( INVALID_HANDLE_VALUE == hFind )
{ // 走査対象フォルダが存在しない。
return FALSE;
}
do
{
if( '.' != fd.cFileName[0] )
{
TCHAR szFoundFilePathName_existing[_MAX_PATH];
_tcsncpy_s( szFoundFilePathName_existing, _MAX_PATH, szDirectoryPathName_existing, _TRUNCATE );
_tcsncat_s( szFoundFilePathName_existing, _MAX_PATH, fd.cFileName, _TRUNCATE );
TCHAR szFoundFilePathName_new[_MAX_PATH];
_tcsncpy_s( szFoundFilePathName_new, _MAX_PATH, szDirectoryPathName_new, _TRUNCATE );
_tcsncat_s( szFoundFilePathName_new, _MAX_PATH, fd.cFileName, _TRUNCATE );
if( FILE_ATTRIBUTE_DIRECTORY & fd.dwFileAttributes )
{ // ディレクトリなら再起呼び出しでコピー
if( !CopyDirectory( szFoundFilePathName_existing, szFoundFilePathName_new ) )
{
FindClose( hFind );
return FALSE;
}
}
else
{ // ファイルならWin32API関数を用いてコピー
if( !CopyFile( szFoundFilePathName_existing, szFoundFilePathName_new, FALSE ) )
{
FindClose( hFind );
return FALSE;
}
}
}
} while( FindNextFile( hFind, &fd ) );
FindClose( hFind );
return TRUE;
}シェル版
BOOL CopyDirectoryUseShellFunc( LPCTSTR lpExistingDirectoryName,
LPCTSTR lpNewDirectoryName )
{
// 入力値チェック
if( NULL == lpExistingDirectoryName
|| NULL == lpNewDirectoryName )
{
return FALSE;
}
// ディレクトリ名の保存(終端に'\'がないなら付ける)(終端を、"\0\0"にする)
TCHAR szDirectoryPathName_existing[_MAX_PATH];
_tcsncpy_s( szDirectoryPathName_existing, _MAX_PATH, lpExistingDirectoryName, _TRUNCATE );
if( '\\' == szDirectoryPathName_existing[_tcslen(szDirectoryPathName_existing) - 1] )
{ // 一番最後に'\'があるなら取り去る。
szDirectoryPathName_existing[_tcslen(szDirectoryPathName_existing) -1] = '\0';
}
szDirectoryPathName_existing[_tcslen(szDirectoryPathName_existing) + 1] = '\0';
TCHAR szDirectoryPathName_new[_MAX_PATH];
_tcsncpy_s( szDirectoryPathName_new, _MAX_PATH, lpNewDirectoryName, _TRUNCATE );
if( '\\' == szDirectoryPathName_new[_tcslen(szDirectoryPathName_new) - 1] )
{ // 一番最後に'\'があるなら取り去る。
szDirectoryPathName_new[_tcslen(szDirectoryPathName_new) -1] = '\0';
}
szDirectoryPathName_new[_tcslen(szDirectoryPathName_new) + 1] = '\0';
if( -1 == _taccess( szDirectoryPathName_existing, 0 ) )
{
return FALSE;
}
if( 0 == _tcsicmp( szDirectoryPathName_existing, szDirectoryPathName_new ) )
{
return FALSE;
}
SHFILEOPSTRUCT fos;
ZeroMemory( &fos, sizeof(SHFILEOPSTRUCT) );
fos.hwnd = NULL;
fos.wFunc = FO_COPY;
fos.pFrom = szDirectoryPathName_existing;
fos.pTo = szDirectoryPathName_new;
fos.fFlags = FOF_NOCONFIRMATION | FOF_MULTIDESTFILES | FOF_NOERRORUI | FOF_SILENT; // | FOF_NOCONFIRMMKDIR
if( SHFileOperation( &fos ) )
{ // 成功すると0が、失敗すると0以外が返る。
return FALSE;
}
return TRUE;
}ネタ元