關於檔案複製的程式程式碼(C++Builder) (轉)

worldblog發表於2007-12-10
關於檔案複製的程式程式碼(C++Builder) (轉)[@more@]

這是一個關於複製的例程,希望有人可以用上,不用再摸索了。

#include
#include

bool ForceExist;
const bufsize = 409600; //基本單位為400K

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(T *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  {
  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;
  SyreeMem(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;
}
//---------------------------------------------------------------------------


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991057/,如需轉載,請註明出處,否則將追究法律責任。

相關文章