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);
}
}
}
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);
}
}
}