#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;
}
}
Shell命令编写——复制命令cp
最新推荐文章于 2024-07-21 10:22:40 发布