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运行结果

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



源码下载

​​点击打开链接​​