前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MFC根据前缀批量复制文件工具

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

作者头像
立羽
发布2023-08-24 13:24:14
1370
发布2023-08-24 13:24:14
举报
文章被收录于专栏:Unity3d程序开发Unity3d程序开发

1 项目描述

1.1功能描述

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

1.2所需技术

递归查找,CFileFind类

2详细设计

2.1在指定目录下查找文件

代码语言:javascript
复制
/************************************************************************
说明:在文件夹中查找文件(仅在指定文件夹查找,不递归)
参数: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递归查找

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

代码语言:javascript
复制
/************************************************************************
说明:在文件夹中递归查找文件
参数: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复制到指定文件夹 

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

代码语言:javascript
复制
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运行结果

源码下载

点击打开链接

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 项目描述
    • 1.1功能描述
      • 1.2所需技术
      • 2详细设计
        • 2.1在指定目录下查找文件
          • 2.2递归查找
            • 2.3复制到指定文件夹 
            • 3运行结果
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档