红联Linux门户
Linux帮助

C++实现文件夹复制

发布时间:2016-10-06 09:40:30来源:linux网站作者:Ladd7
语言:C++
环境:Windows10 x64 visual sudio 2013
Linux Ubuntu16.04 gcc
 
说明:封装了一个类用于复制文件夹到另一指定目录,不删除源文件,不改变源文件/文件夹名。
 
注意:只能复制指定文件夹下的文件,无法处理子目录(以后再改),windows下要用绝对路径。
 
成员描述:
 
1、void copy(const std::string& srcDirPath, const std::string& desDirPath);  
类型:公有。
功能:入口函数,给定源文件夹路径()、和目的文件夹路径,会将源文件夹整个存入目标路径下(而不是只保存内容)。
 
2、bool make_dir ( const std::string& pathName);  
类型:私有。
功能:用于执行创建文件夹操作,需要提供包含路径的完整文件夹名称
 
3、bool get_src_files_name(std::vector<std::string>& fileNameList);  
类型:私有。
功能:遍历源文件夹下所有文件名,并存入list中。
 
4、void do_copy(const std::vector<std::string>& fileNameList);  
类型:私有。
功能:对文件夹下的文件进行拷贝操作,使用到了OpenMP做并行支持。
 
代码:
 
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;  
}
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24775.html