国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Linux&C編程之Linux系統(tǒng)命令“cp -r”的簡單實現(xiàn)

2019-11-08 02:43:15
字體:
供稿:網(wǎng)友

關(guān)于會用到的文件與目錄的一些基本函數(shù)可參考: linux&C編程之Linux系統(tǒng)命令“l(fā)s -l”的簡單實現(xiàn)

一、測試結(jié)果:

這里寫圖片描述

二、源代碼:

1、自定義頭文件copy.h:

/*copy.h*/#ifndef _COPY_H_#define _COPY_H_#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <dirent.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>/*復制文件時的讀寫緩沖區(qū)大小*/#define BUF_SIZE 8092/*保存文件路徑的緩沖區(qū)大小*/#define PATH_SIZE 1024/*文件權(quán)限*/#define FILE_MODE 0664/*目錄權(quán)限*/#define DIR_MODE 0664void sys_err(const char *); /*errno錯誤處理*/void deal_dir(const char *,const char *); /*遞歸函數(shù),處理目錄*/void deal_copy(const char *,const char *); /*處理絕對路徑的文件*/void read_write(void); /*拷貝文件時的讀寫操作*/void mkdir_newdir(const char *); /*為目標創(chuàng)建空目錄*/void get_allpath(char *,char *,const char *,const char *); /*獲取source與target的絕對路徑*/void init_allpath(char *,char *,char *,char *,const char *); /*清空存儲路徑與文件名的緩沖區(qū)并重新賦值*/#endif

2、函數(shù)實現(xiàn)copy.c:

/*copy.c*/#include<copy.h>/**將讀source與寫target的文件描述讀定義成全局變量*fd[0] == fd_read*fd[1] == fd_write*/int fd[2] = {0};void sys_err(const char * ptr){ perror(ptr); exit(EXIT_FAILURE);}void deal_dir(const char *old_path,const char * new_path){ DIR * ret_opdir = opendir(old_path);//打開目錄 if(ret_opdir == NULL) sys_err("opendir"); struct dirent * ret_redir; /*定義緩沖區(qū)存放絕對路徑,eg:/home/krj/test/*/ char buf_old[PATH_SIZE] = {}; char buf_new[PATH_SIZE] = {}; /*存放絕對路徑+文件名,eg:/home/krj/test/test.txt*/ char buf_oldfile[PATH_SIZE] = {}; char buf_newfile[PATH_SIZE] = {}; /*獲取源文件完整路徑與目標位置完整路徑,分別存入buf_old與buf_new中*/ get_allpath(buf_old, buf_new, old_path, new_path); while((ret_redir = readdir(ret_opdir))){//讀取目錄,失敗或目錄讀完返回NULL if(!strcmp(ret_redir->d_name, ".") || !strcmp(ret_redir->d_name, "..")) continue; else{ /*清除上次復制的文件路徑,并填入新讀取到的文件的路徑*/ init_allpath(buf_old, buf_new, buf_oldfile, buf_newfile, ret_redir->d_name); if((ret_redir->d_type & DT_REG) == DT_REG)//如果讀到的文件是普通文件則復制 deal_copy(buf_oldfile, buf_newfile); else if((ret_redir->d_type & DT_DIR) == DT_DIR)//如果讀到的是目錄則遞歸處理目錄 deal_dir(buf_oldfile, buf_newfile); } }}void get_allpath(char * buf_old, char * buf_new, const char * old_path, const char * new_path){ char buf[PATH_SIZE] = {};/*存放當前路徑*/ getcwd(buf,PATH_SIZE);/*獲取當前路徑*/ chdir(old_path);/*改變路徑到source*/ getcwd(buf_old,PATH_SIZE);/*獲取source的絕對路徑*/ strcat(buf_old, "/");/*加上“/”以方便之后向buf_oldfile中補上具體文件名*/ chdir(buf);/*回到原來目錄*/ /*與獲取source絕對路徑相同,獲取target絕對路徑,當然兩次獲取可以簡化成一個函數(shù),由于代碼不是太多就沒過多簡化*/ mkdir_newdir(new_path);//先創(chuàng)建一個空目錄 chdir(new_path); getcwd(buf_new, PATH_SIZE); strcat(buf_new,"/");}void init_allpath(char * buf_old, char * buf_new, char * buf_oldfile, char * buf_newfile, const char * name){ /*清空source與target的帶文件名的絕對路徑緩沖區(qū)*/ memset(buf_oldfile, 0, PATH_SIZE); memset(buf_newfile, 0, PATH_SIZE); /*將source的緩沖區(qū)更新為最新讀到的source文件*/ strcpy(buf_oldfile, buf_old); strcat(buf_oldfile, name); /*同上理*/ strcpy(buf_newfile, buf_new); strcat(buf_newfile, name);}void mkdir_newdir(const char * new_path){ /*目錄不存在返回NULL,則創(chuàng)建空目錄*/ DIR * ret_opdir = opendir(new_path); if(ret_opdir == NULL){ int ret_mkdir = mkdir(new_path, DIR_MODE);/*創(chuàng)建子目錄*/ if(ret_mkdir == -1) sys_err("mkdir newdir"); }}void deal_copy(const char *old_file,const char * pathname){ struct stat get_message; int ret_stat = stat(pathname, &get_message); if(ret_stat == -1 && errno != ENOENT)//文件信息讀取失敗,并且不是因為無該文件造成的 sys_err("stat in copy.c of deal_copy"); fd[0] = open(old_file, O_RDONLY);/*打開source文件*/ if(fd[0] == -1) sys_err("open oldfile in copy_file"); fd[1] = open(pathname, O_CREAT | O_TRUNC | O_RDWR, FILE_MODE);/*創(chuàng)建并打開target文件*/ if(fd[1] == -1) sys_err("open newfile in copy_file"); read_write();/*進行source的讀與對應的target的寫(復制)*/ close(fd[0]); close(fd[1]);} void read_write(void){ char buf[BUF_SIZE] = {}; int ret_read, ret_write; while((ret_read = read(fd[0], buf, BUF_SIZE)) > 0){/*讀到EOF時返回0結(jié)束*/ ret_write = write(fd[1], buf, strlen(buf)); /*等效于ret_write = write(fd[1], buf, ret_read);*/ if(ret_write == -1) sys_err("write newfile"); }}

3、主函數(shù)main.c:

/*******文件名:main.c*時間:2017/2/18-19:57*功能:實現(xiàn)簡單的目錄文件拷貝*限定測試格式:mycp -r source target或:mycp -R source target*局限性:不能使用正則,功能有限******/#include<copy.h>int main(int argc, char ** argv){ if(argc != 4){
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 舒城县| 太原市| 新干县| 朔州市| 志丹县| 岑溪市| 昌邑市| 宝兴县| 咸丰县| 冷水江市| 东乡族自治县| 武城县| 工布江达县| 康平县| 营山县| 崇信县| 凤翔县| 广州市| 延吉市| 孙吴县| 拉萨市| 荆州市| 手机| 湄潭县| 松原市| 县级市| 高雄市| 光山县| 略阳县| 青浦区| 涟水县| 文成县| 垦利县| 祥云县| 皋兰县| 个旧市| 丰顺县| 且末县| 澄江县| 瑞安市| 湘乡市|