n掌握Linux系统调用对文件操作
n掌握linux系统调用的常用函数文件访问用法
1.2实验内容
n使用系统调用方式实现文件拷贝功能
n编写程序,从待拷贝的文件中逐步读出数据到缓冲区,再把缓冲区的数据逐个写入到新创建的文件中,完成对原文件的拷贝工作
n对应代码流程图。
n进入实验代码目录lab9,根据下图参考代码编写filecp.c程序
$vim filecp.c
1、编写好后如下图所示:
2、用gcc编译filecp.c文件,输入命令:$gcc filecp.c –o filecp
生成可执行文件filecp
3、运行应用程序,如下图所示,将filecp.c文件复制为test.c,然后用diff命令比
较两个文件的内容是否一样,一样则说明拷贝正确。
//功能描述:该程序采用系统调用方式通过从待拷贝的文件中逐步读出数据到缓冲区,再把缓冲区的数据逐个写入到新创建的文件中,完成对原文件的拷贝
#include
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024
intmain(intargc,char**argv)
{
intfrom_fd,to_fd;//保存文件描述符
longfile_len=0;//保存文件的总大小
intret=1;
charbuffer[BUFFER_SIZE];//定义缓存区
//判断入口参数
if(argc!=3)
{
printf("Usage:%sfromfile
tofile\n",argv[0]);
exit(1);
}
//打开源文件
if((from_fd=open(argv[1],O_RDONLY|O_CREAT))==-1)
{
printf("Open %s
Error\n",argv[1]);
exit(1);
}
//创建目的文件
if((to_fd=open(argv[2],O_WRONLY|O_CREAT))==-1)
{
printf("Open %s Error\n",argv[2]);
exit(1);
}
//获取文件大小
file_len=lseek(from_fd,0L,SEEK_END);
lseek(from_fd,0L,SEEK_SET);
printf("form file
size is %d\n",file_len);
//文件拷贝
while(ret)
{
ret=read(from_fd,buffer,BUFFER_SIZE);
if(ret==-1)
{
printf("read
Error\n");
exit(1);
}
write(to_fd,buffer,ret);//写入文件
file_len-=ret;
bzero(buffer,BUFFER_SIZE);//清空缓存区
}
printf("there are
%d byte(s)data left without copy\n",file_len);
close(from_fd);
close(to_fd);
exit(0);
}