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

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

#define BUFFERSIZE 4096
#define COPYMODE   0644

int 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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值