上海中鲁通信技术有限公司 张世富
一、 前言 由于目前在WINDOWS环境下(指WINDOWS9.X,WINDOWS 2000,WINDOWS NT等环境,以下同)的一些程序的数据文件需要经常备份,但是操作系统或应用系统却没有提供比较方便的备份程序。因此,需要人工进行周期性的备份,有时会因为工作人员的疏忽忘记备份当天数据,或者不能对数据文件进行完整的备份,从而对系统数据备份的利用造成一定的影响。 二、 设计技术基础 利用DELPHI编程实现定时程序的调用,结合基本的DOS批处理命令和WINDOWS的API函数调用,保证数据文件和数据目录的拷贝,同时可以根据对数据文件的具体要求实现数据文件的动态备份和静态备份。动态备份就是在要进行备份的应用系统运行过程中进行数据文件的备份,静态备份就是通过函数调用停止当前应用程序的运行,进行数据文件的备份,备份完毕调用程序,重新运行应用程序。 三、 系统流程 备份程序的流程如下图所示:
四、 系统实现 1、 配置文件的建立 (1) 文件拷贝运行文件 在运行定时程序的目录下,建立COPY1.BAT批处理文件,内容如下: @echo off copy %1 %2 @echo on 实现文件的拷贝。 (2)目录拷贝运行文件 在运行定时程序的目录下,建立XCOPY1.BAT批处理文件,内容如下: @echo off xcopy %1 %2 /E @echo on 实现目录下文件的拷贝。 (3)建立新目录运行文件 在运行定时程序的目录下,建立MKDIR1.BAT批处理文件,内容如下: @echo off mkdir %1 @echo on 实现新目录的建立。 (4)系统参数配置文件 在运行定时程序的目录下,建立CFG.INI的批处理文件,内容如下: [SERVER] //设置应用程序的运行文件 SERVERNAME=D:\LOTUS\NOTES\NOTES.EXE [DESTINATION] //设置备份文件和目录的一级子目录 PATHNAME=H:\TTT\ [DIRECTORYS] //需备份的目录文件 DIR1=H:\PLAY DIR2=E:\API DIR3=N //N结尾表示备份该目录之前的目录 DIR4= DIR5= //可以继续设定备份目录。 [FILES] //需备份的文件。 FILE1=H:\vss_files\hx.h FILE2=H:\vss_files\c*.* FILE3=N //N结尾表示备份该文件之前的文件 FILE4= FILE5= //可以继续设定备份文件。 [TIMER] //定时设定 INTERVAL=1 //TIMER 程序运行时间间隔 SLEEP1=1 //SLEEP1应用开始停止到拷贝的时间间隔 SLEEP2=2 //SLEEP2开始拷贝到应用程序开始启动的时间间隔 WEEK=6 //WEEK 表示备份的星期的第几天,1—7,1为星期日 TIME=220000 //TIME 程序启动的时间220000表示为22:00:00 //以上时间单位均为分钟,并且TIMER大于SLEEP1和SLEEP2之和。 实现系统参数的配置。 (5) 备份日志记录文件 通过RECORD.TXT文件记录备份的日期和备份启动的时间。 2、 应用程序实现 (1) 在DELPHI的FORM中选取TIMER控件,控件参数可缺省。 (2) 参数初始化,在FORM的CREATE事件里,从配置文件中读入TIMER的各项参数,对系统运行参数进行初始化,主要参数为备份启动时间,备 份的时间间隔,静态备份时间日期等。程序如下: procedure TSrvForm.FormCreate(Sender: TObject); begin Label2.Visible:=False; lpSleep1:=StrToInt(FindName('TIMER','SLEEP1'))*60*1000; lpSleep2:=StrToInt(FindName('TIMER','SLEEP2'))*60*1000; lpInterval:=StrToInt(FindName('TIMER','INTERVAL'))*60*1000; spTime:=FindName('TIMER','TIME'); ipWeek:=StrToInt(FindName('TIMER','WEEK')); Timer1.Interval:=lpInterval ; Timer1.Enabled:=True; end; (3) 建立调用函数,STOPSERVER为停止应用程序运行的函数,STARTSERVER为启动应用程序的函数,BACKUPDATA为数据文件的备份程序。 〈1〉procedure TSrvForm.StartServer(); //启动运行应用程序 Var I,Ret :Integer; sTemp :string; begin sTemp:=FindName('SERVER','SERVERNAME'); I:=WinExec(PChar(sTemp),SW_SHOW); if I<31 then begin Ret:=Application.MessageBox('Start NotesServer Error!','Error!',MB_OK); Exit; end; end; 〈2〉procedure TSrvForm.StopServer(); //停止运行应用程序 Var I,Ret :Integer; sTemp :string; begin sTemp:=FindName('SERVER','SERVERNAME')+' -quit'; I:=WinExec(PChar(sTemp),0); if I<31 then begin Ret:=Application.MessageBox('Stop NotesServer Error!','Error!',MB_OK); Exit; end; end; 〈3〉procedure TSrvForm.BackupData(); //启动数据备份程序 Var sConent,sResourePath,sResoureFile,SDestPath :String; sTemp,sDate,sConst,sDir :string; I,J :Integer; begin sDate:=FormatDateTime('yyyymmdd',Date()); SDestPath:=FindName('DESTINATION','PATHNAME'); sTemp:=SDestPath+sDate; sConst:=sTemp;//Don't change this variable. sConent:='.\mkdir1.bat '+sTemp; I:=WinExec(PChar(sConent),0); //Create data store path if I<31 then begin Application.MessageBox('Mkdir Error!','Error!',MB_OK); Exit; end; //Copy all direstories and files J:=1; while 1=1 do begin sResourePath:=FindName('DIRECTORYS','DIR'+IntToStr(J)); J:=J+1; if sResourePath ='N' then break; //create same name directory sDir:=sConst+FindLastDir(sResourePath); I:=WinExec(PChar('.\mkdir1.bat '+sDir),0); //Create data store path if I<31 then begin Application.MessageBox('Mkdir Error!','Error!',MB_OK); Exit; end; //create end sConent:='.\xcopy1.bat '+sResourePath+' '+ sDir; I:=WinExec(PChar(sConent),0); if I<31 then begin Application.MessageBox('Copy Error!','Error!',MB_OK); Exit; end; end; //Copy all files J:=1; while 1=1 do begin sResoureFile:=FindName('FILES','FILE'+IntToStr(J)); J:=J+1; if sResoureFile ='N' then break; sConent:='.\copy1.bat '+ sResoureFile +' '+ sConst; I:=WinExec(PChar(sConent),0); if I<31 then begin Application.MessageBox('Copy Error!','Error!',MB_OK); Exit; end; end; end; (4) TIMER定时备份程序, 取当前时间,根据规则生成一格式为‘YYYYMMDD’的字符串,作为备份的子目录,用以表示备份数据的日期。从备份日志文件中查找是否已经备份,若已经备份退出程序,无备份则创建备份的子目录。如果是备份为静态备份,停止运行应用程序,若为动态备份,不停止应用程序的运行,进行数据的备份,并根据实际的备份时间进行延时。备份完毕,记录备份日志。程序如下: procedure TSrvForm.Timer1Timer(Sender: TObject); //定时程序调用 Var f: TextFile; sTemp,sDate,sBegin:string; iPos:Integer; begin sDate:=FormatDateTime('yyyymmdd',Now()); sBegin:='['+FormatDateTime('hhnnss',Now())+']'; //backup or not AssignFile(f,'record.txt'); Reset(f); iPos:=0; while NOT EOF(f) do begin Readln(f,sTemp); iPos:=Pos(sDate,sTemp); if iPos>0 then break; end; CloseFile(f); if iPos>0 then exit;//Already backup Label2.Visible:=True; if (DayOfWeek(Date())=ipWeek) and ( FormatDateTime('hhnnss',Now())>spTime) then begin StopSrv(); Sleep(lpSleep1);//wait for lpSleep1/1000/60 minutes BackupData(); Sleep(lpSleep2);//wait for lpSleep2/1000/60 minutes StartSrv(); end else begin if (DayOfWeek(Date())<>ipWeek) and ( FormatDateTime('hhnnss',Now())>spTime) then BackupData() else begin Label2.Visible:=False; exit; end; end; //backup data finish,record the date and time to file1.txt sTemp:= ' ['+FormatDateTime('yyyymmdd',Now())+'] '+sBegin+' ['+FormatDateTime('hhnnss',Now())+'] '; AssignFile(f,'record.txt'); Append(f); Writeln(f, sTemp);//Add backup flag Flush(f); { ensures that the text was actually written to file } { insert code here that would require a Flush before closing the file } CloseFile(f); Label2.Visible:=False; end; (5) 程序实现中需调用WINDOWS的API函数WINEXEC。 五、 系统特点 1、 使用方便,只需将执行程序、各配置文件建立在某一目录下即可运行。 2、 参数配置灵活,通过设置CFG.INI即可满足应用程序的调用和实现。 3、 即可以在WINDOWS 9.X下运行,也可以在WINDOWS NT下运行。 4、 程序运行过程中,无须人工干预。 5、 程序占用系统资源少。 6、 、、、、、、 六、 结束语 该备份程序已经通过DELPHI实现,在WINDOWS98,WINDOWS 2000,WINDOWS NT 4上运行成功,该应用程序自动备份LOTUS NOTES系统下 某目录下的文件和某几个目录,周五进行静态备份,其它时间进行动态备份,每天备份一次。系统运行良好,节省了人工备份的时间 和减少了出错误的可能性。
如果有对此系统感兴趣的人员,可以免费获取程序源码,与作者联系方式,E-MAIL:ZSF@PUB.ONLINE.JN.SD.CN。 |