两个线程拷贝文件
#include <myhead.h>
//定义一个结构体
struct Threadargs
{
const char * srcfile; //argv[1]
const char * dstfile; //argv[2]
int start; //起始位置
int len ; //源文件长度
};
//定义求源文件长度函数
int getlen(const char *srcfile,const char *dstfile)
{
//定义2个文件指针
FILE *srcfd;
FILE *dstfd;
//以只读的方式打开源文件
if((srcfd=fopen(srcfile,"r"))==NULL)
{
perror("srcfile fopen error");
return -1;
}
//以读写的方式打开目标文件
if((dstfd=fopen(dstfile,"w"))==NULL)
{
perror("dstfile fopen error");
return -1;
}
//将光标定位在文件结尾
fseek(srcfd,0,SEEK_END);
int len = ftell(srcfd);
//关闭文件
fclose(srcfd);
fclose(dstfd);
return len;
}
//定义文件拷贝函数
void cpy_file(const char *srcfile,const char *dstfile,int start,int len)
{
//定义2个文件指针
FILE *srcfd;
FILE *dstfd;
//以只读的方式打开源文件
if((srcfd=fopen(srcfile,"r"))==NULL)
{
perror("srcfile fopen error");
return ;
}
//以读写的方式打开目标文件
if((dstfd=fopen(dstfile,"w"))==NULL)
{
perror("dstfile fopen error");
return ;
}
//将光标定位在开始拷贝的位置
fseek(srcfd,0,SEEK_SET);
fseek(dstfd,0,SEEK_SET);
//开始拷贝工作
char buf[128]=""; //搬运工
int sum = 0; //记录搬运的总个数
while(1)
{
//从源文件中读取数据
int ret = fread(buf,1,sizeof(buf),srcfd);
sum+=ret; //记录已经读取字节数
if(ret == 0 || sum>len)
{
fwrite(buf,1,ret-(sum-len),dstfd);
break;
}
fwrite(buf,1,ret,dstfd);
}
//关闭文件
fclose(srcfd);
fclose(dstfd);
}
//创建一个线程体
void *task1(void *arg)
{
//将数据解压出来
struct Threadargs *args = (struct Threadargs*)arg;
//子线程拷贝后一半内容
cpy_file(args->srcfile,args->dstfile,args->len/2,args->len-args->len/2);
}
int main(int argc, const char *argv[])
{
//判断外部传参个数
if(argc!=3)
{
printf("input error\n");
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
//定义一个指针数组
int len = getlen(argv[1],argv[2]);
//初始化结构体成员
struct Threadargs *args =(struct Threadargs*)malloc(sizeof(struct Threadargs));
args->srcfile = argv[1];
args->dstfile = argv[2];
args->start = 0;
args->len = len;
//创建子线程
pthread_t tid1;
if((pthread_create(&tid1,NULL,task1,args))!=0)
{
perror("pthread_create error");
return -1;
}
//我是主线程
//主线程拷贝前一半内容
cpy_file(args->srcfile,args->dstfile,args->start,args->len/2);
pthread_join(tid1,NULL); //阻塞回收线程1资源
return 0;
}

博客主要讲述了使用两个线程进行文件拷贝的内容,涉及信息技术中多线程编程和文件操作相关知识。
10万+

被折叠的 条评论
为什么被折叠?



