语言:C++
环境:Windows10 x64 visual sudio 2013
Linux Ubuntu16.04 gcc
说明:封装了一个类用于复制文件夹到另一指定目录,
不删除源文件,
不改变源文件/文件夹名。
注意:只能复制指定文件夹下的文件,
无法处理子目录(以后再改),
windows下要用绝对路径。
成员描述:
1、
void copy(const std::string& srcDirPath, const std::string& desDirPath);
类型:公有。
功能:入口函数,给定源文件夹路径()、和目的文件夹路径,会将源文件夹整个存入目标路径下(而不是只保存内容)。
bool make_dir ( const std::string& pathName);
类型:私有。
功能:用于执行创建文件夹操作,需要提供包含路径的完整文件夹名称
bool get_src_files_name(std::vector<std::string>& fileNameList);
类型:私有。
功能:遍历源文件夹下所有文件名,并存入list中。
4、
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 文件
/** * 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 文件
/** * 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文件
#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; }