65,186
社区成员




HRESULT CopyFileFromPathToPath(LPCWSTR lpwsSrcPath, LPCWSTR lpwsDestPath, BOOL bDeleteSrc/* = FALSE*/)
{
if(NULL == lpwsSrcPath || !PathFileExistsW(lpwsSrcPath))
return E_INVALIDARG;
WCHAR wszDestPath[MAX_PATH] = {0};
lstrcpynW(wszDestPath, lpwsDestPath, MAX_PATH);
if(FAILED(ForceCreateDirectory(wszDestPath)))
return E_FAIL;
WCHAR wszPath[MAX_PATH] = {0};
lstrcpynW(wszPath, lpwsSrcPath, MAX_PATH);
PathAppendW(wszPath, L"\\*.*");
WIN32_FIND_DATAW fd = {0};
HANDLE hFind = FindFirstFileW(wszPath, &fd);
if(INVALID_HANDLE_VALUE == hFind)
return E_NOINTERFACE;
HRESULT hr = E_FAIL;
do
{
if(fd.cFileName[0] == L'.' || fd.cFileName[0] == L'\0')//特殊文件
{
continue;
}
PathAppendW(wszPath, fd.cFileName);
PathAppendW(wszDestPath, fd.cFileName);
if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//目录
{
hr = CopyFileFromPathToPath(wszPath, wszDestPath, bDeleteSrc);
}
else
{
BOOL bRtn = CopyFileW(wszPath, wszDestPath, TRUE);
if(!bRtn)
{
DWORD dwFileAttrib = GetFileAttributesW(wszDestPath);
SetFileAttributesW(wszDestPath, dwFileAttrib & ~FILE_ATTRIBUTE_READONLY);
bRtn = DeleteFileW(wszDestPath);
if(!bRtn)
{
WCHAR wszTemp[MAX_PATH] = {0};
GetTempPathW(MAX_PATH, wszTemp);
PathAppendW(wszTemp, fd.cFileName);
PathAddExtensionW(wszTemp, L".tmp");
MoveFileW(wszDestPath, wszTemp);
}
bRtn = CopyFileW(wszPath, wszDestPath, TRUE);
}
if(!bRtn)
{
hr = E_FAIL;
break;
}
}
hr = S_OK;
} while (FindNextFileW(hFind, &fd));
FindClose(hFind);
if(bDeleteSrc)
ClearPath(lpwsSrcPath);
return hr;
}