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();
}
}