C++实现文件夹复制

xiaoxiao2021-02-28  103

标签: C++   1396人阅读  评论(1)  收藏  举报   分类: c++(10) 

语言:C++

环境:Windows10 x64 visual sudio 2013

               Linux Ubuntu16.04 gcc

说明:封装了一个类用于复制文件夹到另一指定目录,

       不删除源文件,

       不改变源文件/文件夹名。

注意:只能复制指定文件夹下的文件,

       无法处理子目录(以后再改),

       windows下要用绝对路径。

成员描述:

1、

[cpp]  view plain  copy   void copy(const std::string& srcDirPath, const std::string& desDirPath);  

类型:公有。

功能:入口函数,给定源文件夹路径()、和目的文件夹路径,会将源文件夹整个存入目标路径下(而不是只保存内容)。

2、 [cpp]  view plain  copy   bool make_dir ( const std::string& pathName);  

类型:私有。

功能:用于执行创建文件夹操作,需要提供包含路径的完整文件夹名称

3、 [cpp]  view plain  copy   bool get_src_files_name(std::vector<std::string>& fileNameList);  

类型:私有。

功能:遍历源文件夹下所有文件名,并存入list中。

4、

[cpp]  view plain  copy   void do_copy(const std::vector<std::string>& fileNameList);  

类型:私有。

功能:对文件夹下的文件进行拷贝操作,使用到了OpenMP做并行支持,简单使用方法见我另外几篇博文。

      http://blog.csdn.NET/u012750702/article/details/51476390

      http://blog.csdn.Net/u012750702/article/details/51769576

代码:

copy_dir.h 文件

[cpp]  view plain  copy   /**  * author : Ladd7  */      #ifndef COPYDIR_H   #define COPYDIR_H      #include <string>   #include <vector>      class CopyDir   {   public:       CopyDir();          void copy(const std::string& srcDirPath, const std::string& desDirPath);      public:      private:       bool make_dir (const std::string& pathName);   //    bool mkdir (char const* pathname/*, mode_t mode*/);       bool get_src_files_name(std::vector<std::string>& fileNameList);       void do_copy(const std::vector<std::string>& fileNameList);      private:       std::string srcDirPath, desDirPath;         };      #endif // COPYDIR_H  

copy_dir.cpp 文件

[cpp]  view plain  copy   /**  * author : Ladd7  */      #include "copy_dir.h"      #include <iostream>   #include <fstream>   #include <cstring>      #if defined(_WIN32)   #   include <direct.h>   #   include <io.h>   #   include <shlobj.h>   #   include <sys/stat.h>   #   include <sys/types.h>   #else // Linux   #   include <dirent.h>   #   include <unistd.h>   #   include <sys/stat.h>   #   include <sys/types.h>   #   include <pwd.h>   #endif      CopyDir::CopyDir()   {      }      void   CopyDir::copy(const std::string& srcDirPath, const std::string& desDirPath)   {       this->srcDirPath = srcDirPath;       std::string srcDir;   #ifdef _WIN32       int n = 0;       while (srcDirPath.find('\\', n) != std::string::npos)       {           n = srcDirPath.find('\\', n) + 1;       }       if(n == 0)       {           std::cout << "src path error" << std::endl;           return;       }       srcDir = srcDirPath.substr(n-1, srcDirPath.size());      #else  // Linux       int n = 0;       while (srcDirPath.find('/', n) != std::string::npos)       {           n = srcDirPath.find('/', n) + 1;       }       if(n == 0)       {           std::cout << "src path error" << std::endl;           return;       }       srcDir = srcDirPath.substr(n-1, srcDirPath.size());      #endif       this->desDirPath = desDirPath + srcDir;          if(!make_dir(this->desDirPath))       {           return;       }          std::vector<std::string> fileNameList;       if(!get_src_files_name(fileNameList))       {           return;       }          if(fileNameList.empty())       {           std::cout << "src dir is empty" << std::endl;           return;       }          do_copy(fileNameList);   }      bool   CopyDir::make_dir (const std::string& pathName)   {   #ifdef _WIN32       if(::_mkdir(pathName.c_str()) < 0)       {           std::cout << "create path error" << std::endl;           return false;       }   #else  // Linux       if(::mkdir(pathName.c_str(), S_IRWXU | S_IRGRP | S_IXGRP) < 0)       {           std::cout << "create path error" << std::endl;           return false;       }   #endif          return true;   }      bool   CopyDir::get_src_files_name(std::vector<std::string>& fileNameList)   {   #ifdef _WIN32       _finddata_t file;       long lf;       std::string src = this->srcDirPath + "\\*.*";       if ((lf = _findfirst(src.c_str(), &file)) == -1)        {           std::cout << this->srcDirPath << " not found" << std::endl;           return false;       }       else{           while (_findnext(lf, &file) == 0)           {               if (strcmp(file.name, ".") == 0 || strcmp(file.name, "..") == 0)                   continue;               fileNameList.push_back(file.name);           }       }             _findclose(lf);   #else  // Linux       DIR *dir;       struct dirent *ptr;          if ((dir=opendir(this->srcDirPath.c_str())) == NULL)       {           std::cout << this->srcDirPath << " not found" << std::endl;           return false;       }          while ((ptr=readdir(dir)) != NULL)       {           if((ptr->d_name == ".") || (ptr->d_name == ".."))  //current / parent               continue;           else if(ptr->d_type == 8)  //file               fileNameList.push_back(ptr->d_name);           else if(ptr->d_type == 10)  //link file               continue;           else if(ptr->d_type == 4)  //dir               fileNameList.push_back(ptr->d_name);       }       closedir(dir);      #endif          return true;      }      void   CopyDir::do_copy(const std::vector<std::string> &fileNameList)   {   #pragma omp parallel for       for (int i = 0; i < fileNameList.size(); i++)       {           std::string nowSrcFilePath, nowDesFilePath ;   #ifdef _WIN32           nowSrcFilePath = this->srcDirPath + "\\" + fileNameList.at(i);           nowDesFilePath = this->desDirPath + "\\" + fileNameList.at(i);      #else           nowSrcFilePath = this->srcDirPath + "/" + fileNameList.at(i);           nowDesFilePath = this->desDirPath + "/" + fileNameList.at(i);      #endif           std::ifstream in;           in.open(nowSrcFilePath);           if(!in)           {               std::cout << "open src file : " << nowSrcFilePath << " failed" << std::endl;               continue;           }              std::ofstream out;           out.open(nowDesFilePath);           if(!out)           {               std::cout << "create new file : " << nowDesFilePath << " failed" << std::endl;               in.close();               continue;           }              out << in.rdbuf();              out.close();           in.close();       }   }  

测试:

main.cpp文件

[cpp]  view plain  copy   #include <iostream>   #include "copy_dir.h"   using namespace std;      int main(int argc, char *argv[])   {   #ifdef _WIN32       std::string src = "F:\\data\\test";       std::string des = "F:\\data\\test2";       CopyDir cd;       cd.copy(src, des);   #else       std::string src = "/media/myUbuntu/F/data/test";       std::string des = "/media/myUbuntu/F/data/test2";       CopyDir cd;       cd.copy(src, des);   #endif       return 0;   }  
转载请注明原文地址: https://www.6miu.com/read-52792.html

最新回复(0)