找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3468|回复: 0

【C】C语言写的快速复制文件内容的程序

[复制链接]
发表于 2014-5-9 16:28:07 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这个程序的特点:
1、先试图分配足够大的缓冲区来转储文件内容。如果分配不到足够大的缓冲区则逐字节复制文件内容。否则是逐块复制文件内容。
2、会自动记录复制的字节数量。但是不会有任何输出。
3、需要包含stdio.h
代码如下:
  1. //-----------------------------------------------------------------------------//copyFILE:
  2. //复制文件内容fpSrc到fpDest注意是参数fpDest在前。
  3. //-----------------------------------------------------------------------------
  4. size_t copyFILE(FILE*fpDest,FILE*fpSrc,size_t Len)
  5. {
  6.     void*
  7.         pBuffer;//缓冲区

  8.     size_t
  9.         BufSize=Len,//缓冲区大小
  10.         BufAlloc=Len;//缓冲区分配大小

  11.     size_t
  12.         DataRest=Len;//剩余数据大小

  13.     size_t
  14.         DataCopied=0;//累计拷贝的数据量

  15.     if(!Len)//文件大小为0直接返回
  16.         return DataCopied;

  17.     //先分配足够大的内存来拷贝内容
  18.     do
  19.     {
  20.         if(!BufAlloc)//如果缓冲区大小为0则逐字节复制文件内容
  21.         {
  22.             while(DataRest--)
  23.             {
  24.                 if(feof(fpSrc))//源到文件尾
  25.                     return DataCopied;
  26.                 //目标写入失败
  27.                 if(fputc(fgetc(fpSrc),fpDest)==EOF)
  28.                     return DataCopied;
  29.                 DataCopied++;//统计写入字节数
  30.             }
  31.             return DataCopied;//完成拷贝
  32.         }
  33.         pBuffer=malloc(BufSize);//分配缓冲区
  34.         BufAlloc=BufSize;//记录缓冲区大小
  35.         BufSize>>=1;//如果内存不够就缓冲区大小减半
  36.     }while(pBuffer==NULL);

  37.     //分配到了内存,缓冲区大小为BufAlloc
  38.     //开始批量复制文件内容。
  39.     while(DataRest>=BufAlloc)//剩余数据量大于一个缓冲区
  40.     {
  41.         size_t
  42.             szDataRead,
  43.             szDataWrite;
  44.         szDataRead=fread(pBuffer,1,BufAlloc,fpSrc);//先读取文件到缓冲区并记录读取的量
  45.         szDataWrite=fwrite(pBuffer,1,szDataRead,fpDest);//然后写入缓冲区到文件并记录写入的量
  46.         DataRest-=szDataRead;
  47.         DataCopied+=szDataWrite;
  48.         if( szDataRead!=BufSize||//读取失败或者
  49.             szDataRead!=szDataWrite)//写入失败
  50.             return DataCopied;
  51.     }
  52.     if(DataRest)//如果还有剩余的数据
  53.     {
  54.         size_t
  55.             szDataRead,
  56.             szDataWrite;
  57.         szDataRead=fread(pBuffer,1,DataRest,fpSrc);//先读取文件到缓冲区并记录读取的量
  58.         szDataWrite=fwrite(pBuffer,1,szDataRead,fpDest);//然后写入缓冲区到文件并记录写入的量
  59.         //DataRest-=szDataRead;//暂时不需要
  60.         DataCopied+=szDataWrite;
  61.     }
  62.     return DataCopied;//返回已拷贝的数据量
  63. }
复制代码
十分的简短。参数是文件流。
没有经过测试,不知道效果实际如何。但是经检查应该没有错误了吧?

本帖被以下淘专辑推荐:

回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-6-24 12:10 , Processed in 0.034224 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表