#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 128
//文件复制
int cover(char* src_file,char* dst_file)
{
int n=0;
int src_fd=0;
int dst_fd=0;
char buf[BUFFER_SIZE]={'\0'};
if((src_fd = open(src_file,O_RDONLY)) == -1)
{
perror("open error");
return 1;
}
if((dst_fd = open(dst_file,O_WRONLY )) == -1)
{
perror("open error");
return 1;
}
while((n=read(src_fd,buf,BUFFER_SIZE))>0)
{
write(dst_fd,buf,n);
}
close(dst_fd);
close(src_fd);
printf("覆盖完成!!!\n");
sleep(2);
return 0;
}
int newbuilt(char* src_file,char* dst_file)
{
int src_fd = 0;
int dst_fd = 0;
int n=0;
char buf[BUFFER_SIZE]={'\0'};
//1.open
if((src_fd = open(src_file,O_RDONLY)) == -1)
{
perror("open error");
return 1;
}
if((dst_fd = open(dst_file,O_WRONLY | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR)) == -1)
{
perror("open error");
return 1;
}
//2.1 read data from src_file,知道读到源文件的尾部为止
//2.2 write data to dst_file
while((n=read(src_fd,buf,BUFFER_SIZE))>0)
{
write(dst_fd,buf,n);
}
//3.close
close(dst_fd);
close(src_fd);
return 0;
}
//主程序
int main(int argc,char *argv[])
{
//int access(const char *path,int mode);
if(argc !=3)
{
printf("usage : %s dirname\n",argv[0]);
return 0;
}
char* src_file = argv[1];
char* dst_file = argv[2];
if(access(dst_file,F_OK) == 0)
{
printf("文件存在,请选择复制方式:\n");
int choice = 0;
while(1)
{
system("clear");
printf("\t\t***********************\n");
printf("\t\t\t1.覆盖文件\n");
printf("\t\t\t2.不覆盖文件\n");
printf("\t\t\t3.退出操作\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
cover(src_file,dst_file);
return;
case 2:
printf("请输入新的文件名:");
char arr[32]="\0";
scanf("%s",arr);
newbuilt(src_file,arr);
return;
case 3:
return;
default:
printf("输入有误,请重新输入!!!");
}
}
}
else
{
printf("文件不存在,正在进行复制操作\n");
sleep(2);
newbuilt(src_file,dst_file);
}
}
//1.打开原文件
//2.判断目的文件是否存在
//3.如果目的存在,提示是否覆盖
//4.如果选择覆盖,则以只写的方式打开,并截短文件(O_TRUNC)
//5.如果选择不覆盖,则提醒输入新的保存文件名,并以只写方式打开
//6.循环读取源文件内容,写入到目的文件中
//7.关闭以打开的文件
//思考题:1:能否关闭标准输入文件、标准输出文件、标准输出文件?
//练习:getopt函数
//实现一个简单的ls命令,实现-a和-l功能
//将上述的代码修改成普通的ls命令(即不显示隐藏文件)
//strncmp
//-l stat
/*
int stat (const char* restrict path,struct stat *restrict buf)
//参数:
// path :待获取信息的文件或目录的路径
// buf:接受该文件详细的结构体的地址值
struct stat file_stat;
stat("/home/",&file_stat);
printf("%s",stat.st_link);
*/