复制文件夹及目录下的所有文件

复制文件夹及目录下的所有文件

大意是使用通配符 *.*遍历文件夹下所有文件。但是文件名和后缀为空,例如:./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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值