复制目录下所有文件夹和目录CopyFile()
想一下,若要复制文件夹,可以在目录位置新建一个文件夹,然后将源文件夹中里面的文件进行遍历,一个一个的复制到目标文件夹中即可。
void EnumCopyFile
(
/*输入参数*/
TCHAR* szSrcRootDir, /*需确保,源目录确实存在*/
TCHAR* szDestRootDir /*需确保,目标目录确实存在*/
)
{
TCHAR szSrcSearchDir[MAX_PATH];
TCHAR szSrcDir[MAX_PATH];
TCHAR szSrcFilePath[MAX_PATH];
TCHAR szDestPath[MAX_PATH];
HANDLE hFile;
DWORD dwAttrs;
WIN32_FIND_DATA findFileData;
/*针对用户输入的字符串最后有\\ 做的兼容处理*/
CString szSrcRootDirCstring(szSrcRootDir);
if (szSrcRootDirCstring.ReverseFind('\\') == szSrcRootDirCstring.GetLength() - 1)
{
szSrcRootDirCstring.Delete(szSrcRootDirCstring.GetLength() - 1, 1);
SecureZeroMemory(szSrcRootDir,sizeof szSrcRootDir);
StringCchCopy(szSrcRootDir,MAX_PATH,szSrcRootDirCstring.GetBuffer());
}
CString szDestRootDirCstring(szDestRootDir);
if (szDestRootDirCstring.ReverseFind('\\') == szDestRootDirCstring.GetLength() - 1)
{
szDestRootDirCstring.Delete(szSrcRootDirCstring.GetLength() - 1, 1);
SecureZeroMemory(szDestRootDir, sizeof szDestRootDir);
StringCchCopy(szDestRootDir, MAX_PATH, szDestRootDirCstring.GetBuffer());
}
//以全通配形式做文件遍历
StringCchCopy(szSrcSearchDir, MAX_PATH, szSrcRootDir);
StringCchCopy(szSrcDir, MAX_PATH, szSrcRootDir);
StringCbCat(szSrcSearchDir, MAX_PATH * sizeof(TCHAR), _T("\\*.*"));
hFile = FindFirstFile(szSrcSearchDir, &findFileData);
if (hFile == INVALID_HANDLE_VALUE)
return;
do
{
if (!_tcscmp(_T("."), findFileData.cFileName) || !_tcscmp(_T(".."), findFileData.cFileName))
continue;
if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //这是一个目录,递归入口..做文件复制.
{
TCHAR szSubSrcDir[MAX_PATH] = { 0 };
StringCchCopy(szSubSrcDir, MAX_PATH, szSrcRootDir);
StringCchPrintf(szSubSrcDir, sizeof(szSubSrcDir) / sizeof(szSubSrcDir[0]), _T("%s\\%s"), szSubSrcDir, findFileData.cFileName);
TCHAR szSubDestDir[MAX_PATH] = { 0 };
StringCchCopy(szSubDestDir,MAX_PATH, szDestRootDir);
StringCchPrintf(szSubDestDir,sizeof(szSubDestDir)/sizeof(szSubDestDir[0]),_T("%s\\%s"), szSubDestDir, findFileData.cFileName);
CreateDirectory(szSubDestDir,NULL); //FILE_FLAG_BACKUP_SEMANTICS 创建子目录
EnumCopyFile(szSubSrcDir, szSubDestDir);
}
else
{
SecureZeroMemory(szDestPath, sizeof szDestPath);
SecureZeroMemory(szSrcFilePath, sizeof szSrcFilePath);
//构造目标文件路径
StringCchPrintf(szDestPath, sizeof(szDestPath) / sizeof(szDestPath[0]), _T("%s\\%s"), szDestRootDir, findFileData.cFileName);
//构造源文件路径
StringCchCopy(szSrcFilePath, MAX_PATH, szSrcDir);
StringCchPrintf(szSrcFilePath, sizeof(szSrcFilePath) / sizeof(szSrcFilePath[0]), _T("%s\\%s"), szSrcRootDir, findFileData.cFileName);
if (CopyFile(szSrcFilePath, szDestPath, FALSE))
{
//复制完成后,如果不是只读的,则更新文件属性为只读
dwAttrs = GetFileAttributes(findFileData.cFileName);
if (dwAttrs != INVALID_FILE_ATTRIBUTES)
{
if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
{
SetFileAttributes(szDestPath, FILE_ATTRIBUTE_READONLY);
}
}
}
}
} while (FindNextFile(hFile, &findFileData));
FindClose(hFile);
}
int _tmain(int argc,TCHAR* argv)
{
TCHAR* target_dir = _T("D:\\copyDestDirectory");
TCHAR ugii_root_dir[50] = {0};
GetEnvironmentVariable(_T("UGII_ROOT_DIR"), ugii_root_dir,50);
CreateDirectory(_T("D:\\copyDestDirectory"), NULL);
EnumCopyFile(ugii_root_dir, target_dir);
return 0;
}