MFC根据前缀批量复制文件工具

1 项目描述

 

1.1功能描述

实现根据给出的文件名的前缀,在指定的文件夹中查找与前缀相同全部的文件,然后输出到指定的文件。

1.2所需技术

递归查找,CFileFind类

2详细设计

2.1在指定目录下查找文件

/************************************************************************
说明:在文件夹中查找文件(仅在指定文件夹查找,不递归)
参数:fileName:要查找的文件名。支持通配符*
	  directory:要查找的文件所在的目录路径
返回值:pair<string,string>类型的数组,map<文件名,文件路径>
************************************************************************/
vector<pair<CString, CString>> CCopyToolDlg::FindFilesInDirecotry(CString fileName, CString directory)
{
	vector<pair<CString, CString>> files;

	if (directory.Right(1) != "\\") //保证目录是以\结尾的
	{
		directory += "\\";
	}
	directory += fileName;
	CFileFind finder;
	directory += "*.*";
	BOOL success = finder.FindFile(directory);
	while (success)
	{
		success = finder.FindNextFile();
		CString name = finder.GetFileName();
		CString path = finder.GetFilePath();
		pair<CString, CString> fileMap(name, path);

		CString sFile = fileMap.first;
		if (sFile.Find('.') != -1)
		{
			files.push_back(fileMap);
		}
	}
	finder.Close();
	return files;
}

2.2递归查找

即查找文件下所有与前缀相同的文件,当文件夹下面还有文件夹时,进行递归查找。

/************************************************************************
说明:在文件夹中递归查找文件
参数:fileName:要查找的文件名。支持通配符*
	  directory:要查找的文件所在的目录路径
	  recursionCount:递归查找的深度,默认为-1(不限制深度),0表示只搜索给定的directory目录
返回值:pair<string,string>类型的数组,map<文件名,文件路径>
************************************************************************/
vector<pair<CString, CString>> CCopyToolDlg::FindFilesInDirecotryRecursion(CString fileName, CString directory, int recursionCount)
{
	vector<pair<CString, CString>> files;

	int curRecursionCount = recursionCount;

	//先对参数传进来的文件夹查找
	vector<pair<CString, CString>> localFiles = FindFilesInDirecotry(fileName, directory);
	files.insert(files.end(), localFiles.begin(), localFiles.end());

	//然后对此文件夹下面的子文件夹递归查找
	CFileFind finder;
	if (directory.Right(1) != "\\") //保证目录是以\结尾的
	{
		directory += "\\";
	}
	directory += "*.*";
	BOOL res = finder.FindFile(directory);
	while (res)
	{
		res = finder.FindNextFile();
		CString path = finder.GetFilePath();
		CString name = finder.GetFileName();
		curRecursionCount = recursionCount;  //查找同级目录的时候将当前深度设置为给定值
		if (finder.IsDirectory() && !finder.IsDots())
		{
			if (curRecursionCount >= 1 || curRecursionCount == -1)
			{
				if (curRecursionCount >= 1)
				{
					curRecursionCount--;
				}
				localFiles = FindFilesInDirecotryRecursion(fileName, path, curRecursionCount); //如果目标是个文件夹,则利用嵌套来遍历
				files.insert(files.end(), localFiles.begin(), localFiles.end());
			}
		}
	}
	finder.Close();
	return files;
}

2.3复制到指定文件夹 

根据递归查找得到所有匹配文件的路径,保存进一个容器中,复制时,遍历此容器,取出路径进行文件的复制。

void CCopyToolDlg::fileCopyTo(CString sDesPath ,MapFileInfo mapFileInfo)
{
	for (auto it = mapFileInfo.begin(); it != mapFileInfo.end(); it++)
	{
		CString sOriPath = it->second;
		CString filename;
		CFileFind filefinder;
		BOOL bfind = filefinder.FindFile(sOriPath);

		CString SourcePath, DisPath;
		while (bfind)
		{
			bfind = filefinder.FindNextFile();
			filename = filefinder.GetFileName();
			SourcePath = sDesPath + "\\" + filename;
			DisPath = sDesPath + "\\" + filename;

			bool bFolderExist = PathFileExists(sDesPath);
			if (bFolderExist == FALSE)
			{
				CreateDirectory(sDesPath, NULL);

			}
			const char *pOri = (LPSTR)(LPCTSTR)sOriPath;
			const char *pDes = (LPSTR)(LPCTSTR)DisPath;
			CopyFile((LPCTSTR)pOri, (LPCTSTR)pDes, false);
		}
		filefinder.Close();
	}
}

3运行结果



源码下载

点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四夕立羽

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值