打印本文 打印本文  关闭窗口 关闭窗口  
关于文件复制的程序代码
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:39:09  文章录入:杜斌  责任编辑:杜斌

  这是一个关于文件拷贝的例程,希望有人可以用上,不用再摸索了。

  #include <stdio.h>
  #include <sys\stat.h>


  bool ForceExist;
  const bufsize = 409600; //基本单位为400K

  //---------------------------------------------------------------------------
  void __fastcall TForm1::FormCreate(TObject *Sender)
  {
     Edit1->Text = ExtractFilePath(ParamStr(0));
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
     if (OpenDialog1->Execute())
     {
        AnsiString fFile = OpenDialog1->FileName;
        AnsiString tFile = Edit1->Text+ExtractFileName(fFile);
        if (CopyFile(fFile,tFile))
        {
  
               //复制成功....
        }
        else {
           ForceExist = false;
           DeleteFile(tFile);
        }
     }
  }
  //---------------------------------------------------------------------------
  bool TForm1::CopyFile(AnsiString FromFile,AnsiString ToFile)
  {
     bool result(false);
     FILE *FromF,*ToF;
     int NumRead,NumWritten;
     /* BUFSIZ is defined in stdio.h */
     char buf[bufsize];

     Screen->Cursor = crHourGlass;
     ToF = fopen(ToFile.c_str(),"wb");
     FromF = fopen(FromFile.c_str(),"rb");
     try
     {
        StartTime = Now();
        struct stat statbuf;
        /* get information about the file */
        fstat(fileno(FromF), &statbuf);
        int ModVal = statbuf.st_size % bufsize;
        int MaxVal = statbuf.st_size / bufsize;
        if (ModVal) MaxVal++;
        ProgressBar1->Max = MaxVal;
        float fSize = statbuf.st_size;
        TVarRec args[2] = {0,fSize};
        lblFileSize->Caption = Format("文件大小: %.*n字节", args, 1);
        lblStartTime->Caption = "开始时间: "+FormatDateTime("hh:nn:ss",StartTime);

        ForceExist = false;
        ProgressBar1->Position = 0;
        do
        {
           if (ProgressBar1->Position<MaxVal-1)
           {
             NumRead = fread(&buf, sizeof(buf), 1, FromF);   // read the data
              NumWritten = fwrite(&buf, sizeof(buf), 1, ToF); // Write the data
             fSize = bufsize * (ProgressBar1->Position + 1);
             }
           else if (ModVal) {//当剩余的数据不足400K时,需作特殊处理...
              char *Smallbuf;
              Smallbuf = (char *)SysGetMem(ModVal);
              NumRead = fread(Smallbuf, ModVal, 1, FromF);   // read the data
              NumWritten = fwrite(Smallbuf, ModVal, 1, ToF); // Write the data
              fSize += ModVal;
              SysFreeMem(Smallbuf);
              NumRead = 0;
           }
           ProgressBar1->Position++;
           TVarRec args[2] = {0,fSize};
           lblFileTrans->Caption = Format("已经复制: %.*n字节", args, 1);
           lblElapseTime->Caption = "已用时间: "+FormatDateTime("hh:nn:ss",Now()-StartTime);
           Application->ProcessMessages();
        }
        while (!ForceExist && (NumRead!=0 || NumRead==NumWritten));
        ProgressBar1->Position++;
        fclose(ToF);
        fclose(FromF);
        result = !ForceExist;
     }
     catch(...)
     {
        fclose(ToF);
        fclose(FromF);
        MessageDlg("在复制文件时出现错误,未能完成操作。", mtWarning, TMsgDlgButtons() << mbOK, 0);
     }
     Screen->Cursor = crDefault;
     return result;
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::BtnStopClick(TObject *Sender)
  {
  if (MessageDlg("正在复制文件,是否要取消操作?", mtWarning, TMsgDlgButtons() << mbYes << mbNo, 0)==mrYes)
     ForceExist = true;
  }
  //---------------------------------------------------------------------------
打印本文 打印本文  关闭窗口 关闭窗口