文件夹复制(Linux)

C实现

#include "unistd.h"            //所需头文件定义
#include "string.h"
#include "dirent.h"
#include "utime.h"
#include "stdio.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#define MAX_PATH 1024                         // 定义最大路径长度
void copy_data(char *spath, char *dpath)      //复制一个文件
{
      int nbyte;
                            //读出n个字节
    int pDir_s, pDir_d;
                   //源文件句柄pDir_s, 目标文件句柄pDir_d
    char buf[BUFSIZ] ;
                    //文件内容缓冲区
        struct stat file_stat;
              //文件属性 file_stat
    struct utimbuf mod_time;
            //文件时间属性
        stat(spath, &file_stat) ;
            //读取源文件属性
    if ((pDir_s = open(spath, 0)) == - 1)      //打开源文件
    
  {
                printf("无法打开文件 %s,权限不足!\n", spath) ;
      //源文件不可读
        exit(0);
        
  }
      pDir_d = creat(dpath, 0777);
                       //创建一个目标文件,可读可写,可执行
    while ((nbyte = read(pDir_s, buf, BUFSIZ)) > 0)         //从源文件读取内容,写入目标文件
    
  {
                if (write(pDir_d, buf, nbyte) != nbyte)      
           
    {
                  printf("写数据出现异常错误!\n") ;
            //写数据出错,退出
                        exit(0);
                  
    }
        
  }
      mod_time.actime = file_stat.st_atime;
               //修改目标文件时间属性,保持和源文件一致
        mod_time.modtime = file_stat.st_mtime;
          utime(dpath, &mod_time) ;
          chmod(dpath, file_stat.st_mode);
                      //修改目标文件权限,保持和源文件一致
    close(pDir_s) ;
                                      //关闭文件句柄
    close(pDir_d) ;
}
void mycp(char *source, char *des)               //拷贝一个目录,以及目录下子目录和相应的文件
{
      struct dirent *ent = NULL;
            //定义目录属性dirent
    struct utimbuf mod_time;
                   //定义目录时间属性变量
    char spath[MAX_PATH] = "", dpath[MAX_PATH] = "" ;
       //源文件路径spath,目标文件路径dpath
        DIR *pDir;
                                 //句柄
    struct stat file_stat;
                    //文件或者目录属性变量file_stat
    strcpy(spath, source) ;
                    
    strcpy(dpath, des) ;
                      
    pDir = opendir(source);
                     //打开当前目录
    while (NULL != (ent = readdir(pDir)))     //循环读取文件或目录属性,遍历文件夹
        
  {
                  
        if (strcmp(ent->d_name, "..") == 0 || strcmp(ent->d_name, ".") == 0)  //遇到子目录'.'或父母录标记'..',继续
            continue;
                        if (ent->d_type == 4)     //d_type = 4,表示当前为子目录   
                    
    {
                                      strcat(dpath, "/");
               
                strcat(dpath, ent->d_name) ;
               //构建目标文件子目录路径
                strcat(spath, "/");
                      strcat(spath, ent->d_name) ;
               //构建源文件子目录路径
                                stat(spath, &file_stat);
                   //读取源文件子目录属性
                mkdir(dpath, 0777);
                   //创建目标文件子目录,可读可写,可执行
                mod_time.actime = file_stat.st_atime;
         
                 //修改目标子目录时间属性和源子目录时间属性保持一致
                                mod_time.modtime = file_stat.st_mtime;
                      mycp(spath, dpath);
                        //递归拷贝子目录
                                chmod(dpath, file_stat.st_mode);
           //修改目标子目录权限,保持和原子目录权限一致
                                utime(dpath, & mod_time) ;
                 //设置目标子目录时间属性,保持和原子目录一致
                                strcpy(dpath, des);
                        //还原路径
                strcpy(spath, source) ;
                          
    }
                            else
    {
                        //d_type != 4,是文件,调用copy_data直接拷贝
                                strcat(dpath, "/");
                         //构建目标文件路径
                strcat(dpath, ent->d_name) ;
                      strcat(spath, "/");
                        //构建源文件路径
                strcat(spath, ent->d_name) ;
                      copy_data(spath, dpath);
                   //拷贝一个文件
                                strcpy(dpath, des);
                        //还原路径
                strcpy(spath, source);
                   
                     
    }
                
  }
}
int main(int argc, char *argv[])
{
      DIR *pDir;
      struct stat file_stat;
      struct utimbuf mod_time;
                   //定义目录时间属性变量
    if (argc < 2)  //必须有2个参数, 一个为源文件夹路径,一个为目标文件夹路径
    
  {
            printf("argument error!\n");
            return 0;
        
  }
      printf("Copy start!\n");
        //提示开始copy
    if (pDir = opendir(argv[1]) == NULL)
    
  {
            printf("The file you want to copy do not exist!\n");
            return 0;
        
  }
          stat(argv[1], &file_stat) ;
      //读取原路径文件夹属性
        if (pDir = opendir(argv[2]) == NULL);
       //如果目标文件夹不存在,则新建目标文件夹
        mkdir(argv[2], file_stat.st_mode);
      mod_time.actime = file_stat.st_atime;
               //修改目标文件时间属性,保持和源文件一致
    mod_time.modtime = file_stat.st_mtime;
      utime(argv[2], & mod_time) ;
             //设置目标子目录时间属性,保持和原子目录一致
    mycp(argv[1], argv[2])         ; //完成copy的函数
      printf("Copy complete!\n") ;    //提示完成copy
             return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 需求:复制文件夹到Linux目录下,覆盖该Linux目录下所有同名文件夹 目标:Linux下,执行本脚本,输入文件...
    Hackart阅读 1,842评论 0 2
  • C实现
    SummerC0ld阅读 283评论 0 0
  • 文/小纯姐姐 港囧里面,那个吻了好几年都没吻到的唇,一直在男主的心中抹灭不去,仿佛少了那个吻,人生就不够完整。 也...
    小纯姐姐阅读 397评论 0 1
  • 曾几何时,坐在学校的操场上与闺蜜畅谈未来划画时,我也想过有一天要去支教一段时间,远离喧嚣,寻找一份内心的纯净和超脱...
    2038c9d69906阅读 326评论 0 0
  • #清凉法语#学会脚踏实地 所谓迷茫,就是才华配不上梦想:大事干不了,小事不肯干;不想做手边的事,只想做天边的事。—...
    xcy无名阅读 336评论 0 0