#include<iostream>#include<string.h>#include<fstream>#include<cstdio>#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>#include<dirent.h>// //LINUX下历遍目录 opendir -> readdir -> closedir// // 打开 -> 读取 -> 关闭/* Check whether the path identified by 'filename' is a file */staticboolisFile(const std::string& filename){structstat buffer;return(stat(filename.c_str(),&buffer)==0&&S_ISREG(buffer.st_mode));}/* Check whether the path identified by 'filefodler' is a fodler */staticboolisDirectory(const std::string& filefodler){structstat buffer;return(stat(filefodler.c_str(),&buffer)==0&&S_ISDIR(buffer.st_mode));}/* Copy the file named by old_name to new_name */intcopyFile(const std::string& old_name,const std::string& new_name){
std::ifstream ifs(old_name, std::ifstream::binary);
std::ofstream ofs(new_name, std::ifstream::binary| std::ifstream::trunc);if(ifs.good()==false){return-1;}
ofs << ifs.rdbuf();
ifs.close();
ofs.close();return0;}/* Copy all files and sub directories in directory to new path */intcopyFileAndDirectory(const std::string& old_path,const std::string& new_path){int result =0;
DIR * p_dir;structdirent* p_dirent;if(isDirectory(old_path)){if(access(new_path.c_str(),0)==-1){if(mkdir(new_path.c_str())<0){
std::cout<<"[copyFileAndDirectory] mkdir failed , the errno = "<<strerror(errno)<< std::endl;return-1;}}if((p_dir =opendir(old_path.c_str()))==NULL){
std::cout <<"Usage:cp -r <src_dir> <dat_dir> error: "<<strerror(errno)<< std::endl;return-1;}while((p_dirent =readdir(p_dir))!=NULL){
std::string file_name = old_path +"/"+ p_dirent->d_name;
std::string new_file_name = new_path +"/"+ p_dirent->d_name;// It is a directoryif(isDirectory(file_name)&&(0!=strcmp(p_dirent->d_name,"."))&&(0!=strcmp(p_dirent->d_name,".."))){
result =copyFileAndDirectory(file_name,new_file_name);if(result <0){return result;}}elseif((0!=strcmp(p_dirent->d_name,"."))&&(0!=strcmp(p_dirent->d_name,".."))){
result =copyFile(file_name, new_file_name);if(result <0){return result;}}}closedir(p_dir);}return result;}/* Remove all files and sub directories in directory */intremoveFileAndDirectory(const std::string& path){int result =0;
DIR * p_dir;structdirent* p_dirent;if(isDirectory(path)){if((p_dir =opendir(path.c_str()))==NULL){
std::cout <<"Opendir error: "<<strerror(errno)<< std::endl;return-1;}while((p_dirent =readdir(p_dir))!=NULL){
std::string file_name = path +"/"+ p_dirent->d_name;/* It is a directory */if(isDirectory(file_name)&&(0!=strcmp(p_dirent->d_name,"."))&&(0!=strcmp(p_dirent->d_name,".."))){
result =removeFileAndDirectory(file_name);if(result <0){return result;}}/* It is a file */elseif((0!=strcmp(p_dirent->d_name,"."))&&(0!=strcmp(p_dirent->d_name,".."))){
result =remove(file_name.c_str());if(result <0){return result;}}else{/* do nothing */}}closedir(p_dir);
result =rmdir(path.c_str());}elseif(isFile(path)){
result =remove(path.c_str());}else{/* do nothing */}return result;}intmain(void){//参数可以是绝对路径或者相对路径
std::string src ="./123";
std::string des ="./1234";int result =copyFileAndDirectory(src, des);
std::cout<< result << std::endl;
result =removeFileAndDirectory(src);
std::cout<< result << std::endl;return0;}