复制文件夹及目录下的所有文件
程序员文章站
2024-03-09 09:56:41
...
复制文件夹及目录下的所有文件
大意是使用通配符 *.*遍历文件夹下所有文件。但是文件名和后缀为空,例如:./ASD/. 若相对路径ASD存在,这个文件居然被认为是存在的。。
/*判断一个路径是否是已存在的目录*/
BOOL IsDirectory(const char* pstrPath)
{
if (NULL == pstrPath)
{
return FALSE;
}
/*去除路径末尾的反斜杠*/
std::string strPath = pstrPath;
if (_access(pstrPath, 0) == 0)
{
if (*strPath.rbegin() == '\\' || *strPath.rbegin() == '/')
{
return TRUE;
}
}
return FALSE;
}
int copyFolder(const char* pstrSrcFolder, const char* pstrDstFolder)
{
/*复制目录中的所有内容*/
if ((NULL == pstrSrcFolder) || (NULL == pstrDstFolder))
return FALSE;
/*检查源目录是否是合法目录*/
if (!IsDirectory(pstrSrcFolder))
return FALSE;
/*把文件名称转换为CString类型,并确认目录的路径末尾为反斜杠*/
std::string strSrcFolder = pstrSrcFolder;
if (*strSrcFolder.rbegin() != '\\')
{
strSrcFolder += "\\";
}
std::string strDstFolder = pstrDstFolder;
if (*strDstFolder.rbegin() != '\\')
{
strDstFolder += "\\";
}
std::string::size_type pos = strSrcFolder.find('/');
while (pos != std::string::npos)
{
strSrcFolder.replace(pos, 1, "\\");
pos = strSrcFolder.find('/');
}
pos = strDstFolder.find('/');
while (pos != std::string::npos)
{
strDstFolder.replace(pos, 1, "\\");
pos = strDstFolder.find('/');
}
/*如果是目录自身复制,直接返回复制成功*/
if (0 == strcmp(strSrcFolder.c_str(), strDstFolder.c_str()))
{
return TRUE;
}
/*如果目的目录不存在,则创建目录*/
if (!IsDirectory(strDstFolder.c_str()))
{
if (!MakeSureDirectoryPathExists(strDstFolder.c_str()))
{
/*创建目的目录失败*/
return FALSE;
}
/*if (!CreateDirectory(strDstFolder.c_str(), NULL))
{
}*/
}
/*创建源目录中查找文件的通配符*/
std::string strWildcard = strSrcFolder;
strWildcard += "*.*";
/*打开文件查找,查看源目录中是否存在匹配的文件*/
/*调用FindFile后,必须调用FindNextFile才能获得查找文件的信息*/
WIN32_FIND_DATA pfileData;
memset(&pfileData, 0, sizeof(pfileData));
HANDLE hFindFile = FindFirstFile(strWildcard.c_str(), &pfileData);
int bWoring = 1;
while (hFindFile != INVALID_HANDLE_VALUE && bWoring)
{
std::string strSrcFile = strSrcFolder;
strSrcFile += pfileData.cFileName;
std::string strDstFile = strDstFolder;
strDstFile += pfileData.cFileName;
if (IsDirectory(strSrcFile.c_str()))
{
if (!copyFolder(strSrcFile.c_str(), strDstFile.c_str()))
{
int a = 0;
//return FALSE;
}
}
else
{
if ((_access(strSrcFile.c_str(), 0) == 0) && !CopyFile(strSrcFile.c_str(), strDstFile.c_str(), FALSE))
{
int a = 0;
//return FALSE;
}
}
memset(&pfileData, 0, sizeof(pfileData));
bWoring = FindNextFile(hFindFile, &pfileData);
}
return TRUE;
}
推荐阅读