0xAA55 发表于 2014-5-9 16:28:07

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

这个程序的特点:
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;//返回已拷贝的数据量
}十分的简短。参数是文件流。
没有经过测试,不知道效果实际如何。但是经检查应该没有错误了吧?
页: [1]
查看完整版本: 【C】C语言写的快速复制文件内容的程序