ufrmmain.pas
来自「数据自动备份系统的简易实现,DELPHI实现.」· PAS 代码 · 共 1,273 行 · 第 1/4 页
PAS
1,273 行
begin
if not btnStart.Enabled then //判断启动按钮是否有效,如果无效则说明正在执行备份
begin
DoShowErrorMessageDlg('请先停止备份监视.');
Exit;
end;
DoDeleteTask;
end;
procedure TfrmMain.DoLoadTaskList;
var
objTaskInfoINI: TStrings;
I, iPos: Integer;
objItem: TListItem;
strCurTask, strBackupWay, strIniPath, strImageIndex, strTaskName, strTaskTime, strTaskTimeType, strTaskType, strSaveType, strBackupDest, strSavePath: string;
begin
objTaskInfoINI := TStringList.Create;
try
//读取
strIniPath := ExtractFilePath(Application.ExeName) + 'TaskInfo.INI';
objTaskInfoINI.LoadFromFile(strIniPath); //读取
LvTaskList.Items.Clear;
for I := 0 to objTaskInfoINI.Count - 1 do
begin
strCurTask := objTaskInfoINI.Strings[I];
strCurTask := LowerCase(Trim(strCurTask));
if not SameText(strCurTask, '') then
begin
//获取图标编号
iPos := Pos(LowerCase('<ImageIndex>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<ImageIndex>') - 1);
iPos := Pos(LowerCase('</ImageIndex>'), strCurTask);
strImageIndex := Copy(strCurTask, 1, iPos - 1);
//获取任务名称
iPos := Pos(LowerCase('<TaskName>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<TaskName>') - 1);
iPos := Pos(LowerCase('</TaskName>'), strCurTask);
strTaskName := Copy(strCurTask, 1, iPos - 1);
//获取执行时间
iPos := Pos(LowerCase('<TaskTime>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<TaskTime>') - 1);
iPos := Pos(LowerCase('</TaskTime>'), strCurTask);
strTaskTime := Copy(strCurTask, 1, iPos - 1);
//获取备份类型
iPos := Pos(LowerCase('<TaskType>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<TaskType>') - 1);
iPos := Pos(LowerCase('</TaskType>'), strCurTask);
strTaskType := Copy(strCurTask, 1, iPos - 1);
//获取保存方式
iPos := Pos(LowerCase('<SaveType>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<SaveType>') - 1);
iPos := Pos(LowerCase('</SaveType>'), strCurTask);
strSaveType := Copy(strCurTask, 1, iPos - 1);
//获取备份目标
iPos := Pos(LowerCase('<BackupDest>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<BackupDest>') - 1);
iPos := Pos(LowerCase('</BackupDest>'), strCurTask);
strBackupDest := Copy(strCurTask, 1, iPos - 1);
//获取保存
iPos := Pos(LowerCase('<SavePath>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<SavePath>') - 1);
iPos := Pos(LowerCase('</SavePath>'), strCurTask);
strSavePath := Copy(strCurTask, 1, iPos - 1);
//获取检测频率
iPos := Pos(LowerCase('<TaskTimeType>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<TaskTimeType>') - 1);
iPos := Pos(LowerCase('</TaskTimeType>'), strCurTask);
strTaskTimeType := Copy(strCurTask, 1, iPos - 1);
//获取备份方式
iPos := Pos(LowerCase('<BackupWay>'), strCurTask);
Delete(strCurTask, 1, iPos + Length('<BackupWay>') - 1);
iPos := Pos(LowerCase('</BackupWay>'), strCurTask);
strBackupWay := Copy(strCurTask, 1, iPos - 1);
objItem := LvTaskList.Items.Add; //在任务列表中创建新的任务项
try
objItem.ImageIndex := StrToInt(strImageIndex);
except
if SameText(strTaskType, '备份文件') or SameText(strTaskType, '备份目录') then objItem.ImageIndex := 0
else objItem.ImageIndex := 1;
end;
objItem.Caption := strTaskName; //给任务象添加任务名称
objItem.SubItems.Add(strTaskTime); //给任务象添加执行时间
objItem.SubItems.Add(strTaskType); //给任务象添加备份类型
objItem.SubItems.Add(strSaveType); //给任务象添加保存方式
objItem.SubItems.Add(strBackupDest); //给任务象添加备份目标
objItem.SubItems.Add(strSavePath); //给任务象添加保存目录
objItem.SubItems.Add(strTaskTimeType); //给任务象添加检测频率
objItem.SubItems.Add(DateTimeToStr(Now));
objItem.SubItems.Add(strBackupWay); //备份方式
end;
end;
DoSystemLog('加载任务信息成功.');
finally
objTaskInfoINI.Free;
end;
end;
procedure TfrmMain.DoSaveTaskList;
var
objTaskInfoINI: TStrings;
I: Integer;
objItem: TListItem;
strCurTask, strBackupWay, strImageIndex, strTaskName, strTaskTime, strTaskTimeType, strTaskType, strSaveType, strBackupDest, strSavePath: string;
begin
objTaskInfoINI := TStringList.Create;
try
//循环保存文件备份任务
for I := 0 to LvTaskList.Items.Count - 1 do
begin
objItem := LvTaskList.Items[I];
strImageIndex := IntToStr(objItem.ImageIndex);
strTaskName := objItem.Caption; //获取任务名称
strTaskTime := objItem.SubItems.Strings[0]; //获取执行时间
strTaskType := objItem.SubItems.Strings[1]; //获取备份类型
strSaveType := objItem.SubItems.Strings[2]; //获取保存方式
strBackupDest := objItem.SubItems.Strings[3]; //获取备份目标
strSavePath := objItem.SubItems.Strings[4]; //获取保存目录
strTaskTimeType := objItem.SubItems.Strings[5]; //获取检测频率
strBackupWay := objItem.SubItems.Strings[7]; //备份方式
strCurTask := '<ImageIndex>' + strImageIndex + '</ImageIndex>'
+ '<TaskName>' + strTaskName + '</TaskName>'
+ '<TaskTime>' + strTaskTime + '</TaskTime>'
+ '<TaskType>' + strTaskType + '</TaskType>'
+ '<SaveType>' + strSaveType + '</SaveType>'
+ '<BackupDest>' + strBackupDest + '</BackupDest>'
+ '<SavePath>' + strSavePath + '</SavePath>'
+ '<TaskTimeType>' + strTaskTimeType + '</TaskTimeType>'
+ '<BackupWay>' + strBackupWay + '</BackupWay>';
objTaskInfoINI.Add(strCurTask); //把任务添加到字符串列表
end;
//把字符串列表中的信息保存到执行文件
objTaskInfoINI.SaveToFile(ExtractFilePath(Application.ExeName) + 'TaskInfo.INI');
DoSystemLog('保存任务信息成功.');
finally
objTaskInfoINI.Free;
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
var
strIniPath: string;
iFileCreate: Integer;
begin
//检查任务配置文件是否存在,如果不存在则创建之
strIniPath := ExtractFilePath(Application.ExeName) + 'TaskInfo.INI';
if not FileExists(strIniPath) then
begin
iFileCreate := FileCreate(strIniPath); //创建任务配置文件
CloseHandle(iFileCreate);
end;
DoLoadTaskList; //加载备份任务信息
btnStart.Enabled := True;
btnStop.Enabled := False;
TaskIDList := TStringList.Create;
rgTaskTime.ItemIndex := 0;
DoLoadFTPParams;
end;
procedure TfrmMain.SystemTimerTimer(Sender: TObject);
var
I: Integer;
strNowTime, strNowDateTime, strCurTime, strCurTaskTimeType, strCurTaskTimeValue: string;
begin
strNowTime := TimeToStr(Time); //获取当前系统时间
strNowDateTime := DateTimeToStr(Now);
strNowTime := LowerCase(strNowTime);
for I := 0 to LvTaskList.Items.Count - 1 do //循环备份任务列表
begin
strCurTaskTimeType := Trim(LvTaskList.Items[I].SubItems[5]); //获取检测频率
strCurTime := Trim(LvTaskList.Items[I].SubItems[6]); //获取最近备份时间
strCurTime := LowerCase(strCurTime);
strCurTaskTimeValue := LvTaskList.Items[I].SubItems[0];
if SameText(strCurTaskTimeType, '按天') then
begin
strCurTime := strCurTaskTimeValue;
if SameText(strCurTime, strNowTime) then //判断备份任务时间是否和当前系统时间相同
begin
LvTaskList.Items[I].SubItems.Strings[6] := strNowDateTime; //修改最近备份日期
TaskIDList.Add(LvTaskList.Items[I].Caption); //把可以执行的备份任务的编号添加到任务执行队列
end;
end;
if SameText(strCurTaskTimeType, '按时') then
begin
strCurTime := TimeToStr(StrToDateTime(strCurTime) + StrToInt(strCurTaskTimeValue) * 0.0416666666666667);
if SameText(strCurTime, strNowTime) then //判断备份任务时间是否和当前系统时间相同
begin
LvTaskList.Items[I].SubItems.Strings[6] := strNowDateTime; //修改最近备份日期
TaskIDList.Add(LvTaskList.Items[I].Caption); //把可以执行的备份任务的编号添加到任务执行队列
end;
end;
if SameText(strCurTaskTimeType, '按分') then
begin
strCurTime := TimeToStr(StrToDateTime(strCurTime) + StrToInt(strCurTaskTimeValue) * 0.000694444444444442);
if SameText(strCurTime, strNowTime) then //判断备份任务时间是否和当前系统时间相同
begin
LvTaskList.Items[I].SubItems.Strings[6] := strNowDateTime; //修改最近备份日期
TaskIDList.Add(LvTaskList.Items[I].Caption); //把可以执行的备份任务的编号添加到任务执行队列
end;
end;
if SameText(strCurTaskTimeType, '按秒') then
begin
strCurTime := TimeToStr(StrToDateTime(strCurTime) + StrToInt(strCurTaskTimeValue) * 1.15740740740389E-5);
if StrToTime(strCurTime) <= StrToTime(strNowTime) then //判断备份任务时间是否和当前系统时间相同
begin
LvTaskList.Items[I].SubItems.Strings[6] := strNowDateTime; //修改最近备份日期
TaskIDList.Add(LvTaskList.Items[I].Caption); //把可以执行的备份任务的编号添加到任务执行队列
end;
end;
Application.ProcessMessages; //刷新程序消息
end;
end;
procedure TfrmMain.TaskTimerTimer(Sender: TObject);
var
I, iBackupType, iSaveType: Integer;
strTaskName, strBackupWay, strBackupDest, strSavePath, strLastBackupTime: string;
begin
if TaskIDList.Count > 0 then
begin
TaskTimer.Enabled := False;
strTaskName := TaskIDList.Strings[0];
for I := 0 to LvTaskList.Items.Count - 1 do
begin
if SameText(LvTaskList.Items[I].Caption, strTaskName) then
begin
iBackupType := LvTaskList.Items[I].ImageIndex; //根据图表判断备份类型
if SameText(LvTaskList.Items[I].SubItems.Strings[2], '本地备份') then
iSaveType := 0
else if SameText(LvTaskList.Items[I].SubItems.Strings[2], '异地备份-局域网') then
iSaveType := 1
else
iSaveType := 2; //异地备份-FTP
strLastBackupTime := LvTaskList.Items[I].SubItems[6]; //最近备份时间
strBackupDest := LvTaskList.Items[I].SubItems.Strings[3]; //获取备份目标
strSavePath := LvTaskList.Items[I].SubItems.Strings[4]; //获取保存目录
strBackupWay := LvTaskList.Items[I].SubItems.Strings[7]; //获取备份方式
DoBackup(iBackupType, iSaveType, strBackupDest, strSavePath, strLastBackupTime, strBackupWay); //备份
TaskIDList.Delete(0);
end;
Application.ProcessMessages; //刷新程序消息
end;
end;
TaskTimer.Enabled := True;
end;
procedure TfrmMain.DoBackup(iBackupType, iSaveType: Integer; sBackupDest,
sSavePath, sLastBackupTime, sBackupWay: string);
//获取文件名
function GetNameByFileName(sFileName: string): string;
// var
// strCurDateTime: string;
begin
// strCurDateTime := DateTimeToStr(Now);
// strCurDateTime := AnsiReplaceText(strCurDateTime, ':', '_');
// strCurDateTime := AnsiReplaceText(strCurDateTime, ' ', '_');
// strCurDateTime := '(' + strCurDateTime + ')';
// Result := strCurDateTime + ExtractFileName(sFileName);
Result := ExtractFileName(sFileName);
end;
//获取没有扩展名的文件名
function GetNameByFileNameWithOutExt(sFileName: string): string;
var
iPos: Integer;
strName: string;
begin
strName := GetNameByFileName(sFileName);
iPos := Pos('.', strName);
if iPos > 0 then
strName := Copy(strName, 1, iPos - 1);
Result := strName;
end;
function GetFileNameByDateTime: string;
var
strFileName: string;
begin
strFileName := DateTimeToStr(Now);
strFileName := AnsiReplaceText(strFileName, ':', '_');
strFileName := AnsiReplaceText(strFileName, ' ', '_');
Result := strFileName;
end;
var
I: Integer;
ObjectList: TStrings;
strCurFile, strCprBackupFile, strMoveSrc, strMoveDest: string;
begin
case iBackupType of
0: //备份文件,备份目录
begin
try
ObjectList := TStringList.Create;
ObjectList.Clear;
try
if DirectoryExists(sBackupDest) then //如果是目录,则遍历获取所有文件
begin
EnumFileInRecursion(PChar(sBackupDest), ObjectList, sLastBackupTime);
end
else
begin
ObjectList.Add(sBackupDest); //是文件则直接添加
end;
for I := 0 to ObjectList.Count - 1 do
begin
strCurFile := Trim(ObjectList.Strings[I]);
//获取文件时间进行比对
if Copy(sSavePath, Length(sSavePath), 1) = '\' then
begin
//拷贝源文件到目标路径下
strCprBackupFile := sSavePath + GetNameByFileName(strCurFile);
end
else
begin
strCprBackupFile := sSavePath + '\' + GetNameByFileName(strCurFile);
end;
if FileExists(strCprBackupFile) then
begin
//判断文件最后修改时间是否大于备份文件的修改时间,如果不大于则处理下一个文件
if not (GetFileLastModifyDateTime(strCurFile) <> GetFileLastModifyDateTime(strCprBackupFile)) then
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?