一切皆文件 这是我四个月前第一次接触Linux时老师说的第一句话
在Linux下 对文件进行拷贝的命令是 : cp 源文件路径 目的文件路径
这个命令大家都很熟悉了 今天想自己实现 如何实现文件的拷贝 ;
1.1版本 : 刚着手时候的想法很朴素 就像把大象装进冰箱里的想法一样 分三步;
step 1: 打开源文件和目的文件 (如果目的文件不存在就创建一个)
step 2: 读源文件 (一个字符) 写到目的文件 直到读完为止
step 3: 关闭源文件 和 目的文件
这是我1.1版本的源代码:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int f_in=open("/home/uesr/Desktop/file.c",O_RDWR);
int f_out=open("/home/uesr/Desktop/file1.c",O_RDWR|O_CREAT,0666);
char ch;
while(read(f_in,&ch,1))
{
write(f_out,&ch,1);
}
close(f_in);
close(f_out);
exit(0);
}
很简单 是不是?这个版本存在的问题是 : 必须前提要求给的路径都是简单的文件名 或者使完整的路径 负责在step1 就会失败 然而我当时还没有对打开失败做处理机制
2.1版本 :
加入 文件打开失败的处理机制 , 如果目的文件只有路径 将源文件的文件名找到 作为目的文件的文件名 这是我的部分代码截图 :
2.1版本编译运行测试又有问题了 当我源文件不是完整路径的时候 仍然报错 2.1版本也并不通用
3.1版本:
首先判断源文件给的到底是文件名 还是路径 再针对不同的情况 作不同的处理
最终3.1版本测试成功! 无论第一个参数是源文件名 还是 源文件的完整地址+文件名 也无论第二个参数是 目的文件名 还是目的文件的不完整路径 都可以成功拷贝
当然 如果源文件没有文件名的话 就根本不知道要去拷贝谁了 这种不诚心的拷贝 只能报错了 。
接下来附上完整的代码, 如果还有什么问题 望批评指正!
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <assert.h> int main(int argc,char *argv[])
{
if(argc<3)
{
printf("input error!\n");
exit(0);
}
int f_in=open(argv[1],O_RDONLY);
assert(f_in!=-1);
int f_out=open(argv[2],O_WRONLY|O_CREAT,0666);
if(f_out==-1)
{
char name[128];
char *n=name;
strcpy(n,argv[2]);
n+=strlen(name);
strcpy(n,"/");
n++;
strcpy(n,argv[1]);
f_out=open(name,O_WRONLY|O_CREAT,0666);
if(f_out==-1)
{
int j;
for(j=0;j<strlen(name);j++)
{
name[j]='\0';
}
n=name;
strcpy(n,argv[2]);
char *s=argv[1];
s=s+strlen(argv[1])-1;
n+=strlen(name);
int i;
for(i=strlen(argv[1]);i>0;i--,s--)
{
if(*s=='/')
{
strcpy(n,s);
break;
}
}
// printf("%s\n",name);
f_out=open(name,O_WRONLY|O_CREAT,0666);
assert(f_out!=-1);
}
}
char ch;
while(read(f_in,&ch,1))
{
write(f_out,&ch,1);
}
close(f_in);
close(f_out);
exit(0);
}