使用系统调用方式实现文件拷贝

1.1实验目的

n掌握Linux系统调用对文件操作

n掌握linux系统调用的常用函数文件访问用法

1.2实验内容

n使用系统调用方式实现文件拷贝功能

1.3步骤及现象

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命令比

较两个文件的内容是否一样,一样则说明拷贝正确。

1.4关键代码分析

//功能描述:该程序采用系统调用方式通过从待拷贝的文件中逐步读出数据到缓冲区,再把缓冲区的数据逐个写入到新创建的文件中,完成对原文件的拷贝

#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);

}

你可能感兴趣的:(使用系统调用方式实现文件拷贝)