今天学习了在linux如何写复制文件的函数,在学习了书上一些基础的库函数和语句后,我自己编写了一个复制文件的函数,虽然过程有些坎坷,但写完还是觉得自己棒棒哒~
#include <stdio.h>
#include<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define PERMS 0666
#define DUMMY 0
#define BUFSIZE 1024
main(int argc,char *argv[]) //要求用户用cp格式输入命令(cp替换为./a.out)
{
int source_fd,target_fd,num;
char iobuffer[BUFSIZE];
if(argc!=3) //若输入格式正确(./a.out os.c b.c,os.c为源文件,b.c为新文件),则可以开始打开文件
{
printf("复制功能打开失败");
return 1;
}
if((source_fd=open(*(argv+1),O_RDONLY,DUMMY))==-1) //打开源文件失败open函数会返回-1,将open函数返回的值赋给文件描述符
{
printf("1文件打开失败");
return 2;
}
if((target_fd=open(*(argv+2),O_WRONLY|O_CREAT,PERMS))==-1) //我的文件夹里没有b.c文件,所以会自动建立b.c文件,建立成功返回-1
{
printf("2文件打开失败");
return 3;
}
while((num=read(source_fd,iobuffer,BUFSIZE))>0) //将源文件里的内容读到iobuffer中,若返回值小于0,则读完文件,跳出循环
if(num!=write(target_fd,iobuffer,num)) //读的字节数要和写入的字节数保持一致,否则出错,跳出程序
{
printf("文件复制错误");
return 4;
}
close(source_fd); //复制完成,关闭源文件
close(target_fd); //复制完成,关闭新文件
}
但是运行结果貌似有点问题呢。。
最后几行好像不见了。。
(昨天没有写完)今天回来改错,却发现错误奇迹的自己好了。。
但是我发现了一个新的问题,就是已经写过的文件不能重新写入,也就是内容不可以覆盖,于是我重新检查了一遍代码,我发现我的write函数里少了一个参数O_TRUNC
这个参数是如果文件存在,则该文件截断
的意思,也就是可以覆盖已经存在的文件,因为少了这个参数,所以不可以覆盖。
加了这个参数就对了,已经创建的文件也可以覆盖粘贴。