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

原创 2007年10月15日 22:23:00
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);
      }
   }

用BCB控件编写TCP/IP通讯程序的基础知识

最近在网上不断的看到有人问如何用BCB的TServerSocket和TClientSocket进行编程的问题,所以决定把我的一些编程经验告诉给大家,让大家能够尽快的掌握他们的用法。 首先要讲一下他们...
  • lixingshi
  • lixingshi
  • 2014年11月25日 15:26
  • 1184

BCB 动态生成控件

窗体上的所有对象与窗体本身都成为一个类:TForm1,我们就是将类成员与类成员函数写到TForm1类中,程序运行时,实际上就是通过TForm1 类生成Form1对象, 所以,Unit1.cpp...
  • u014438664
  • u014438664
  • 2015年03月29日 23:46
  • 497

常用的BCB 函数

文件: ActnList  CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。  EnumRegisteredAction 过程 枚举已...
  • binnygoal
  • binnygoal
  • 2016年09月08日 16:17
  • 1252

BCB中的输入对话框和输出对话框(也就是消息对话框)

刚出去转了一下, 吹吹风, 回来继续写。 我们现在来说BCB中的输出对话框, 这个很常见: //--------------------------------------------...
  • stpeace
  • stpeace
  • 2015年07月26日 14:35
  • 1993

关于BCB中,Excel的一些操作(存底)

将一个Excel或sheet的部分内容复制到另一个Excel或sheet,并设置边框 //----------------------------------------------------...
  • enjoy0104
  • enjoy0104
  • 2015年01月05日 23:32
  • 907

BCB6使用ReportMachine创建报表

RM(Report Machine)是一个功能强大的Delphi 报表控件包。使用它可以制作出非常复杂的报表。下面讲述最简单的用法:  在Form上放上两个数据库控件:ADOConnection和A...
  • limuyun
  • limuyun
  • 2014年05月16日 17:08
  • 1805

[转]:BCB中的文件操作

毕设所需原文地址:[转]:BCB中的文件操作作者:Neil 转载自:
  • RCKLV
  • RCKLV
  • 2017年06月01日 18:21
  • 474

BCB如何加载字符串资源文件(语言资源文件)?

如何在软件.exe中嵌入语言资源呢。常规的想法是, 将语言字符串放到一个文件中, 然后在程序中去读取。 然而这样做存在一个问题: 最后发布的.exe必须依赖于语言字符串文件, 比如lang.txt. ...
  • stpeace
  • stpeace
  • 2015年07月26日 12:45
  • 1588

60个BCB(C++Build)初学者 应用实例

1.怎样在C++Builder中创建使用DLL 2.用C++Bulider在WIN.INI中保存信息 3.如何在C++Builder中检测硬件 4.C++Builder如何响应消息及自定义消息 ...
  • qq_31209383
  • qq_31209383
  • 2017年03月20日 15:35
  • 234

AnsiString的基本用法 bcb第一弹

最近由于处在半转型状态,学bcb也是模模糊糊。 由于在学C++builder,ansistring是bcb中提供的类跟java中的String差不多  但是,比c++ 中的String在bcb中...
  • limuyun
  • limuyun
  • 2014年05月30日 15:21
  • 1460
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BCB ADO 备份 恢复 任何类型 数据库 文件
举报原因:
原因补充:

(最多只允许输入30个字)