要实现文件的拷贝,需要操作两个文件,一个是原文件,即被拷贝的文件,一个是目标文件。
原文件:必须存在,并且以只读的方式打开,然后读取里面的内容,放入 buf 缓冲区;
目标文件:如果存在就清空里面的内容再把从 buf 缓冲区写入到该文件中;如果不存在则创建一个新的空文件,重复上面的操作。
这里目标文件的清空使用 O_TRUNC 宏,该宏打开一个文件时,会将原文件的内容清空。
还需要注意的一点是:这里定义的 buf 缓冲区是 64 字节,有可能从原文件中读取到的字节数大于64,会导致 64 字节之后的内容没有读取到,所以需要用一个循环来存放读取字节数。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
if(argc != 3)//命令行输入3个参数,如果不足,则提示用户
{
printf("Usage: %s <src_filename> <dst_filename>\n", argv[0]);
}
int fd1 = open(argv[1], O_RDONLY);//源文件以只读方式打开
if(fd1 < 0)
{
perror("open src_file");
return -1;
}
int fd2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0664);//目标文件如果不存在,就创建且赋权限为0664;如果存在,就清空再写入
if(fd2 < 0)
{
perror("open dst_file");
return -1;
}
int ret;
char buf[64] = {0};
//从fd1文件中读取字符放入缓冲区中,一次最大读64个个字节,用ret接收;读到的数据如果超过64个字节,则一次性无法读取完整,所以用循环读取
while((ret = read(fd1, buf, 64)) > 0)
{
write(fd2, buf, ret);//把读到的内容写入fd2中
}
return 0;
}