ソフトウェア開発 Win32プログラミング

ディレクトリ(フォルダ)をコピーする

戻る


ディレクトリ(フォルダ)をコピーするコードを以下に示す。

#include <windows.h>

BOOL CopyDirectory(LPCTSTR pszExistingDir, LPCTSTR pszNewDirectory)
{
    TCHAR szCurDir[MAX_PATH], szNewPath[MAX_PATH], szNewDir[MAX_PATH];
    LPTSTR pch;
    HANDLE hFind;
    WIN32_FIND_DATA find;
    BOOL fSuccess;
    DWORD dwError;
 
    GetFullPathName(pszNewDirectory, MAX_PATH, szNewDir, &pch);
    CreateDirectory(szNewDir, NULL);
    dwError = GetLastError();
    if (GetFileAttributes(szNewDir) == 0xFFFFFFFF)
    {
        SetLastError(dwError);
        return FALSE;
    }
 
    GetCurrentDirectory(MAX_PATH, szCurDir);
    if (!SetCurrentDirectory(pszExistingDir))
        return FALSE;
 
    lstrcpy(szNewPath, szNewDir);
    pch = szNewPath + lstrlen(szNewPath);
    pch = CharPrev(szNewPath, pch);
    if (*pch != TEXT('\\'))
    {
    	pch = CharNext(pch);
        *pch++ = TEXT('\\');
        *pch = TEXT('\0');
    }
    else
        pch++;
 
    fSuccess = TRUE;
    dwError = ERROR_SUCCESS;
    hFind = FindFirstFile(TEXT("*"), &find);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            if (lstrcmp(find.cFileName, TEXT(".")) != 0 &&
                lstrcmp(find.cFileName, TEXT("..")) != 0)
            {
                lstrcpy(pch, find.cFileName);
                if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    if (!CopyDirectory(find.cFileName, szNewPath))
                    {
                        dwError = GetLastError();
                        fSuccess = FALSE;
                        break;
                    }
                }
                else
                {
                    if (!CopyFile(find.cFileName, szNewPath, FALSE))
                    {
                        dwError = GetLastError();
                        fSuccess = FALSE;
                        break;
                    }
                }
            }
        } while(FindNextFile(hFind, &find));
        FindClose(hFind);
    }
 
    SetCurrentDirectory(szCurDir);
    SetLastError(dwError);
    return fSuccess;
}
 
#ifdef UNITTEST
int main(void)
{
	BOOL f = CopyDirectory("C:\\TEST", "C:\\TEST2");
	printf("%d, %ld\n", f, GetLastError());
	return 0;
}
#endif	/* def UNITTEST */

なお、SHFileOperation関数を使って以下のようにコピーする方法もあるが、 これはシェル関数なので、シェルに影響する。

SHFILEOPSTRUCT shfos;
ZeroMemory(&shfos, sizeof(SHFILEOPSTRUCT));
shfos.hwnd = NULL;
shfos.wFunc = FO_COPY;
shfos.pFrom = TEXT("C:\\TEST");
shfos.pTo = TEXT("C:\\TEST2");
shfos.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT;
SHFileOperation(&shfos);

ソース: copydir.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system