BCB ADO 备份 恢复 任何类型 数据库 文件

TMainForm *MainForm;
bool ForceExist;
const bufsize = 409600; //复制文件基本单位为400K
String DBfilename;

//可以备份/恢复任何类型的数据库文件------------------------------------------
bool __fastcall TMainForm::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
   {
      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++;
      int Blockcount = 0;
    //  float fSize = statbuf.st_size;
    //  TVarRec args[2] = {0,fSize};
      ForceExist = false;
      do
      {
         if (Blockcount <MaxVal-1)
         {
            NumRead = fread(&buf, sizeof(buf), 1, FromF);   // read the data
            NumWritten = fwrite(&buf, sizeof(buf), 1, ToF); // Write the data
           // fSize = bufsize * (Blockcount + 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;
         }
         Blockcount++;
         Application- >ProcessMessages();    //可以通过设置ForceExist停止复制
      }
      while (!ForceExist && (NumRead!=0  ¦ ¦ NumRead==NumWritten));
      //Blockcount++;
      fclose(ToF);
      fclose(FromF);
      result = !ForceExist;
   }
   catch(...)
   {
      fclose(ToF);
      fclose(FromF);
     // MessageDlg("在复制文件时出现错误,未能完成操作。", mtWarning, TMsgDlgButtons()  < < mbOK);
     MessageBox(Handle,"在复制文件时出现错误,未能完成操作。" ,  "警告" , MB_OK);
     }
   Screen- >Cursor = crDefault;
   return result;
}

//备份数据---------------------------------------------------------------------------

void __fastcall TMainForm::DataBakMenuClick(TObject *Sender)
{
 if (SaveDialog1- >Execute())
  {
      ADOConnection1- >Connected = false; //关闭数据库
      AnsiString fFile =  ExtractFilePath(ParamStr(0))+ExtractFileName(DBfilename);
      AnsiString tFile = SaveDialog1- >FileName;
      if (CopyFile(fFile,tFile))
      {
         ADOConnection1- >Connected == true;
         MainStatusBar- >Panels- >Items[0]- >Text="备份数据成功";
             //复制成功....
      }
      else {
         ForceExist = false;
         DeleteFile(tFile);
      }
   }
}
//恢复数据---------------------------------------------------------------------------

void __fastcall TMainForm::DataRestoreMenuClick(TObject *Sender)
{
  
   if (OpenDialog1- >Execute())
   {  ADOConnection1- >Connected = false;//关闭数据库
      AnsiString fFile = OpenDialog1- >FileName;
      AnsiString tFile =  ExtractFilePath(ParamStr(0))+ExtractFileName(DBfilename);
      if (CopyFile(fFile,tFile))
      {
         ADOConnection1- >Connected == true;
         MainStatusBar- >Panels- >Items[0]- >Text="恢复数据成功";

      }
      else {
         ForceExist = false;
         DeleteFile(tFile);
      }
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值