天天看點

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運作結果

MFC根據字首批量複制檔案工具