主题:请问Delphi中如何编写一个数据库文件备份程序?
请问Delphi中如何编写一个数据库文件备份程序?
我编写的程序如下:
procedure TMainForm.MenuDBBackupClick(Sender: TObject);
var
DefaultFileName,BackupName,EndPath,FilenameStr:string;
OpStruc:TSHFileOpStruct;
frombuf,tobuf:array[0..128]of char;
begin
//判断数据文件是否存在
if fileexists(STPath)=false then
begin
Application.MessageBox('数据库文件不存在!!','提示',MB_OK or MB_ICONERROR);
exit;
end;
//选择保存路径和文件名
DefaultFileName:='All'+formatdatetime('yymmddhhmmam/pm',now);
SaveDatabaseDialog.FileName:=DefaultFileName;
SaveDatabaseDialog.InitialDir:=GetExePath;
if SaveDatabaseDialog.Execute then
begin
EndPath:=ExtractFilePath(SaveDatabaseDialog.FileName);
BackupName:= ExtractFileName(SaveDatabaseDialog.FileName);
fillchar(frombuf,sizeof(frombuf),0);
fillchar(tobuf,sizeof(tobuf),0);
StrPCopy(frombuf,STPath);
StrPCopy(tobuf,EndPath);
with opstruc do
begin
Wnd:=Handle;
wFunc:=FO_COPY;
pFrom:=@frombuf;
PTo:=@tobuf;
fFlags:=FOF_NOCONFIRMATION OR FOF_RENAMEONCOLLISION;
fAnyoperationsAborted:=false;
hNameMappings:=Nil;
lpszProgressTitle:=Nil;
end;
ShFileOperation(OpStruc);
FilenameStr := ExtractFileName(STPath);
BackupName := ChangeFileExt(BackupName, '.BAK');
if not RenameFile(EndPath+FilenameStr, BackupName) then
begin
raise Exception.Create('无法创建备份文件');
exit;
end;
Application.MessageBox('数据库备份成功!','提示',MB_OK or MB_ICONERROR);
end;
end;
function RenameFile(const OldName, NewName: string): Boolean;
begin
{$IFDEF MSWINDOWS}
Result := MoveFile(PChar(OldName), PChar(NewName));
{$ENDIF}
{$IFDEF LINUX}
Result := __rename(PChar(OldName), PChar(NewName)) = 0;
{$ENDIF}
end;
但是每次RenameFile的返回值都是False,请问有谁能告诉我哪里写错了?
我编写的程序如下:
procedure TMainForm.MenuDBBackupClick(Sender: TObject);
var
DefaultFileName,BackupName,EndPath,FilenameStr:string;
OpStruc:TSHFileOpStruct;
frombuf,tobuf:array[0..128]of char;
begin
//判断数据文件是否存在
if fileexists(STPath)=false then
begin
Application.MessageBox('数据库文件不存在!!','提示',MB_OK or MB_ICONERROR);
exit;
end;
//选择保存路径和文件名
DefaultFileName:='All'+formatdatetime('yymmddhhmmam/pm',now);
SaveDatabaseDialog.FileName:=DefaultFileName;
SaveDatabaseDialog.InitialDir:=GetExePath;
if SaveDatabaseDialog.Execute then
begin
EndPath:=ExtractFilePath(SaveDatabaseDialog.FileName);
BackupName:= ExtractFileName(SaveDatabaseDialog.FileName);
fillchar(frombuf,sizeof(frombuf),0);
fillchar(tobuf,sizeof(tobuf),0);
StrPCopy(frombuf,STPath);
StrPCopy(tobuf,EndPath);
with opstruc do
begin
Wnd:=Handle;
wFunc:=FO_COPY;
pFrom:=@frombuf;
PTo:=@tobuf;
fFlags:=FOF_NOCONFIRMATION OR FOF_RENAMEONCOLLISION;
fAnyoperationsAborted:=false;
hNameMappings:=Nil;
lpszProgressTitle:=Nil;
end;
ShFileOperation(OpStruc);
FilenameStr := ExtractFileName(STPath);
BackupName := ChangeFileExt(BackupName, '.BAK');
if not RenameFile(EndPath+FilenameStr, BackupName) then
begin
raise Exception.Create('无法创建备份文件');
exit;
end;
Application.MessageBox('数据库备份成功!','提示',MB_OK or MB_ICONERROR);
end;
end;
function RenameFile(const OldName, NewName: string): Boolean;
begin
{$IFDEF MSWINDOWS}
Result := MoveFile(PChar(OldName), PChar(NewName));
{$ENDIF}
{$IFDEF LINUX}
Result := __rename(PChar(OldName), PChar(NewName)) = 0;
{$ENDIF}
end;
但是每次RenameFile的返回值都是False,请问有谁能告诉我哪里写错了?