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 + -
显示快捷键?