• 4880阅读
  • 0回复

关于文件复制的程序代码[wolf] [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-07-30
这是一个关于文件拷贝的例程,希望有人可以用上,不用再摸索了。

#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;
}
//---------------------------------------------------------------------------
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个