用C语言实现递归的实现和文件夹的拷贝

#include"stdio.h"
#include"sys/stat.h"
#include"dirent.h"
#include"unistd.h"
#include"string.h"
#include"stdlib.h"

void mkdirs(char *);//创建多级目录
void file_copy(char *,char *);//文件拷贝
void dir_copy(char *,char *);//目录拷贝

int mian(){
      dir_copy("/home/sll/ClionProjects/fileDemo/aaa.txt","/home/sll/ClionProjects/fileDemo/bbb.txt");
return 0;
}


void mkdirs(char *path){
        if(access(path,F_ok)==0){}//文件存在
        else{//获取上级目录
              int len =(int )strlen(path);
              int position=-1;
              for(int i=len-1;i>=0;--i){
                 if(path[i]=='/'){
                     position=i;
                      break;
                  }
              }
                if(position==-1){
                  mkdir(path,ACCESSPERMS);//防止相对路径
                  }else{
                         char *newpath=calloc((size_t)position,sizeof(char));
                          mkdirs(strncpy(newpath,path,position));
                          free(newpath);
                          mkdir(path,ACCESSPERMS);
                          }
                      }
                   }
void file_copy(char *old_file,char *new_file){//文件拷贝
             FILE *file=fopen(old_file,"r");
             FILE *fileb=fopen(new_file,"w");
             int c;
             while((c=getc(file))!EOF){//文件介绍符(end of file)-1
             putc(c,fileb);
            }
            fclose(file);
            fclose(fileb);
}
void dir_copy(char *oldpath,char *newpath){//目录拷贝
            DIR *dir=opendir(oldpath);
            if(dir=NULL){//不是目录
                file_copy(oldpath,newpath);
              }else{      
                  mkdirs(newpath);//创建目录
                  struct dirent *dp;
                  while((dp=readdir(dir))!=NULL){
                  if(strcmp(dp->d_name,".")==0||strcmp(dp->d_name,"..")==0)
                  continue;
                  char *oldFileName=calloc(strlen(oldpath)+strlen(dp->d_name)+2,1);
                  char *newFileName=calloc(strlen(newpath)+strlen(dp->d_name)+2,1);
                  dir_copy(strlen(strlen(strlen(oldFileName,oldpath),"/"),dp->d_name),strlen(strlen(strlen(newFileName,newpath),"/"),dp->d_name));
                free(oldFileName);
                free(newFileName);
              }
                closedir(dir);
            }
        }




你可能感兴趣的:(用C语言实现递归的实现和文件夹的拷贝)