- UID
- 1
- 精华
- 积分
- 76365
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
这个程序的特点:
1、先试图分配足够大的缓冲区来转储文件内容。如果分配不到足够大的缓冲区则逐字节复制文件内容。否则是逐块复制文件内容。
2、会自动记录复制的字节数量。但是不会有任何输出。
3、需要包含stdio.h
代码如下:- //-----------------------------------------------------------------------------//copyFILE:
- //复制文件内容fpSrc到fpDest注意是参数fpDest在前。
- //-----------------------------------------------------------------------------
- size_t copyFILE(FILE*fpDest,FILE*fpSrc,size_t Len)
- {
- void*
- pBuffer;//缓冲区
- size_t
- BufSize=Len,//缓冲区大小
- BufAlloc=Len;//缓冲区分配大小
- size_t
- DataRest=Len;//剩余数据大小
- size_t
- DataCopied=0;//累计拷贝的数据量
- if(!Len)//文件大小为0直接返回
- return DataCopied;
- //先分配足够大的内存来拷贝内容
- do
- {
- if(!BufAlloc)//如果缓冲区大小为0则逐字节复制文件内容
- {
- while(DataRest--)
- {
- if(feof(fpSrc))//源到文件尾
- return DataCopied;
- //目标写入失败
- if(fputc(fgetc(fpSrc),fpDest)==EOF)
- return DataCopied;
- DataCopied++;//统计写入字节数
- }
- return DataCopied;//完成拷贝
- }
- pBuffer=malloc(BufSize);//分配缓冲区
- BufAlloc=BufSize;//记录缓冲区大小
- BufSize>>=1;//如果内存不够就缓冲区大小减半
- }while(pBuffer==NULL);
- //分配到了内存,缓冲区大小为BufAlloc
- //开始批量复制文件内容。
- while(DataRest>=BufAlloc)//剩余数据量大于一个缓冲区
- {
- size_t
- szDataRead,
- szDataWrite;
- szDataRead=fread(pBuffer,1,BufAlloc,fpSrc);//先读取文件到缓冲区并记录读取的量
- szDataWrite=fwrite(pBuffer,1,szDataRead,fpDest);//然后写入缓冲区到文件并记录写入的量
- DataRest-=szDataRead;
- DataCopied+=szDataWrite;
- if( szDataRead!=BufSize||//读取失败或者
- szDataRead!=szDataWrite)//写入失败
- return DataCopied;
- }
- if(DataRest)//如果还有剩余的数据
- {
- size_t
- szDataRead,
- szDataWrite;
- szDataRead=fread(pBuffer,1,DataRest,fpSrc);//先读取文件到缓冲区并记录读取的量
- szDataWrite=fwrite(pBuffer,1,szDataRead,fpDest);//然后写入缓冲区到文件并记录写入的量
- //DataRest-=szDataRead;//暂时不需要
- DataCopied+=szDataWrite;
- }
- return DataCopied;//返回已拷贝的数据量
- }
复制代码 十分的简短。参数是文件流。
没有经过测试,不知道效果实际如何。但是经检查应该没有错误了吧? |
|