Shell命令编写——复制命令cp

来源:互联网 发布:淘宝假冒材质违规申诉 编辑:程序博客网 时间:2024/06/05 16:42
#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>#define BUFFERSIZE 4096#define COPYMODE   0644int main(int ac,char *av[]){/*创建输入输出文件的文件描述符*/int in_fd,out_fd;/*成功读取的字符串的长度*/int n_chars;/*字符缓冲区数组*/char buf[BUFFERSIZE];char *source;char *dest;char *param;/*对输入时的参数进行判定*/if(ac < 3 || ac > 4){fprintf(stderr,"usage: %s source destination\n",*av);exit(0);}if(ac==3){source=av[1];dest=av[2];}if(ac==4){source=av[2];dest=av[3];param = av[1];}/*处理同名问题*/if(strcmp(source,dest)==0){printf("源文件与目标文件同名\n");exit(0);}/* * 标准的cp会自动覆盖已经存在的的文件,而不给出任何提示 * 如果一个已经存在的文件file2, * 直接输入# cp file1 file2 * 会自动覆盖file2的内容 * 标准的cp用一个参数 -i 可以再覆盖前给出提示 * 得到确认后才进行覆盖 * * *//*处理已存在文件被自动覆盖的问题*/char cdd; /*参数输入是否正确*/if((strcmp(param,"-i"))==0){/*参数输入正确,判断目的文件是否存在*/        /*用access函数判断文件是否存在比较合适*//*若存在返回0*/if(access(dest,0)==0){              /*  int fd1;  if((fd1=open(dest,O_RDONLY))!=-1){close(fd1);  *//*如果存在该目标文件,应该进行提示*/printf("目标文件已存在,是否覆盖(y|n):");scanf(" %s",&cdd);/*char buf[100];read(0,&buf,100);write(1,&buf,100);char *buf1 = "fdas";write(1,&buf,4);*/if(cdd != 'y'){printf("目标文件存在,将不进行覆盖!\n");exit(0);}}}else{/*如果参数输入的是错误的*/printf("其它参数暂时不能接受,请调整参数\n");printf("cp [-i] source dest");exit(0);}/*用只读方式,打开source的参数所指定的文件,并返回文件描述符*/if((in_fd=open(source,O_RDONLY))==-1){printf("Can not open:%s\n",source);exit(1);}/* 用指定的权限模式创建文件,并命名为dest, * 同时返回创建的文件的文件描述符*/if((out_fd=creat(dest,COPYMODE))==-1){printf("Can not create:%s\n",dest);exit(1);}/*复制数据的过程*//*首先从第一个文件中读取数据,返回读取的长度*/while((n_chars = read(in_fd,buf,BUFFERSIZE))>0){/*按照读取的数据长度将缓冲区的数据写入新文件中*/if(write(out_fd,buf,n_chars)!=n_chars){printf("Write error to :%s\n",dest);exit(1);}}if(n_chars==-1){printf("Read error from:%s\n",source);exit(1);}/*关闭两个文件*/if(close(in_fd)==-1||close(out_fd)==-1){printf("Error close files\n");exit(1);}return 0;}/* 如果执行 close(fd_dest)函数 * 那么scanf() ,read()将不会执行, *  * 如果不执行 close(fd_dest)函数 * 那么 scanf(),read() 会正常执行 *  * 原因? * 要分析close()函数 * 终止文件描述符fd_dest与其对应的文件的关联 * 文件描述符被重新使用 * 成功返回0 ,失败返回-1 * * 分析起来主要原因  * 在judgeFile函数中止的时候, * 系统会通过close函数判断可能需要回收系统资源--文件描述符表 * 因此,主函数中的read,write,scanf会失效 * * */int judgeFile(char *dest){int fd_dest;/*尝试打开目标文件,如果成功,说明目标文件存在,*/if(fd_dest=open(dest,O_RDONLY)==-1){/*close(fd_dest); */return 0;}else{/*文件存在*/close(fd_dest);return 1;}}

原创粉丝点击