關于文件復制的程序代碼

字號:

這是一個關于文件拷貝的例程,希望有人可以用上,不用再摸索了。
    #include
    #include
    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字節(jié)", args, 1);
        lblStartTime->Caption = "開始時間: "+FormatDateTime("hh:nn:ss",StartTime);
        ForceExist = false;
        ProgressBar1->Position = 0;
        do
        {
        if (ProgressBar1->Position        {
         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) {//當剩余的數(shù)據(jù)不足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("已經(jīng)復制: %.*n字節(jié)", 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("在復制文件時出現(xiàn)錯誤,未能完成操作。", 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;
    }
    //---------------------------------------------------------------------------