多线程同时上传文件的实现
2016-09-26 21:58
330 查看
一
首先需要一个结构体
这个结构体应当拥有
(1)源文件的句柄
(2)目标文件的句柄
(3)写文件的起始位置
(4)写文件的终止位置
二
每一个结构体代表了文件的一部分
如果说把文件分成了5份,那就应该定义5个结构体,然后求出文件的大小,把文件的大小分成五份,
然后记录这一部分应当从文件的何处拷贝到何处,以及目标文件和源文件的句柄
三
开始定义线程内的函数,通过lseek函数找到应当找到的位置
然后开始拷贝就好了
以下是我参照别人代码自己实现的多线程拷贝,但不知道为什么有时候会拷贝失误一下下,但是总体是ok的
首先需要一个结构体
这个结构体应当拥有
(1)源文件的句柄
(2)目标文件的句柄
(3)写文件的起始位置
(4)写文件的终止位置
二
每一个结构体代表了文件的一部分
如果说把文件分成了5份,那就应该定义5个结构体,然后求出文件的大小,把文件的大小分成五份,
然后记录这一部分应当从文件的何处拷贝到何处,以及目标文件和源文件的句柄
三
开始定义线程内的函数,通过lseek函数找到应当找到的位置
然后开始拷贝就好了
以下是我参照别人代码自己实现的多线程拷贝,但不知道为什么有时候会拷贝失误一下下,但是总体是ok的
#include <pthread.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #define THREAD_BUFF_SIZE 1024 typedef struct filePart { size_t start; size_t end; int infd;//源文件 int outfd;//目的 }filePart; void* transFile(void* arg) { filePart* block = (filePart*)arg; char buf[THREAD_BUFF_SIZE]; int ret; // size_t count = block->start; ret = lseek(block->infd,block->start,SEEK_SET); ret = lseek(block->outfd,block->start,SEEK_SET); int size = 0; while((size = read(block->infd,buf,sizeof(buf)))>0) { write(block->outfd,buf,size); } pthread_exit(NULL); } size_t get_filesize(int fd) { struct stat st; fstat(fd,&st); return st.st_size; } int main(int argc,char* argv[]) { if(argc<2) { printf("Wrong!"); return -1; } int infd = open(argv[1],O_RDONLY); int outfd = open(argv[2],O_CREAT|O_WRONLY,0644); size_t file_size = get_filesize(infd); int n = 5;//设置五份 filePart* blocks = (filePart*)malloc(sizeof(filePart)*n); int i = 0; size_t percent = file_size/n; for(;i<n;++i) { blocks[i].infd = infd; blocks[i].outfd = outfd; blocks[i].start = i*percent; blocks[i].end = blocks[i].start + percent; } blocks[i].end = file_size; pthread_t ptid[5]; for(i = 0 ; i < n; ++i) { pthread_create(&ptid[i],NULL,transFile,&(blocks[i])); } for(i = 0 ; i < n; ++i) { pthread_join(ptid[i],NULL); } //释放资源 free(blocks); close(infd); close(outfd); printf("Copy Successfully \n"); return 0; }
相关文章推荐
- 实现用File控件同时上传多个文件
- 借助WebService实现多线程上传文件
- 再次奉献源码,webservice实现的多线程断点文件上传下载
- socket 多线程实现文件上传下载
- html代码实现同时上传多个文件
- 多文件同时上传实现方法
- 研究了三天的文件上传(jspsmart实现)file和text表单同时提交的问题
- 借助WebService实现多线程上传文件
- 借助WebService C#实现多线程上传文件
- Struts2轻松实现多文件上传(自定义多线程加速程序效率)
- JSPSmart实现文件上传时file和text表单同时提交的问题
- 实现多个文件同时上传
- 借助WebService实现多线程上传文件
- Asp.Net如何实现多线程上传大文件
- 借助WebService实现多线程上传文件
- 使用FileUpload实现多个文件同时上传
- 我遇到的问题JspSmartUpload组件实现表单和文件同时上传
- 借助WebService实现多线程上传文件
- 借助WebService实现多线程上传文件
- java简单多线程方式+实现文件上传(spring mvc + jquery.form.js 框架)