⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servicecwbackup.~pas

📁 一个定时备份资料的服务程序。有涉及需停止服务时可自动停止服务并在备份结束后自动启动服务。并可将压缩后的文件或目录FTP备份。内含移动短信机接口代码备份情况可短信通知。
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
          if nIMResult = 0 then begin
            iRet := IM_SendSM('CW自动备份失败!','',0,pvsIM_Phone);
            if iRet < 0 then  LogAlarmToText('发送短信失败,返回代码:' + IntToStr(iRet) + '。');
          end;
        end;
    end
  else//备份复制存放到另一个目录
    begin
      LogAlarmToText('开始备份' + sAZML + '目录到' + sDir + '目录...');
      Result := CopyDirectory(sAZML,sDir);
      if Result then
        begin
          LogAlarmToText('目录备份结束。');
          //备份成功检查已经备份的份数,删除过期的备份
          DelBackUpFile(iBackUpCopy,sBFML);
          //上传到FTP
          if bPutFtp then begin
            LogAlarmToText('上传' + sDir + '目录到FTP服务器.');
            UploadPerFTP(sDir,pvs_Ftp_FtpDir[0],MyFtpClient);
            LogAlarmToText('目录上传完毕.');
          end;
        end
      else
        begin
          Result := False;
          LogAlarmToText('目录备份失败!');
          if nIMResult = 0 then begin
            iRet := IM_SendSM('CW自动备份失败!','',0,pvsIM_Phone);
            if iRet < 0 then  LogAlarmToText('发送短信失败,返回代码:' + IntToStr(iRet) + '。');
          end;
        end;
    end;
  //启动所有服务
  StarAllServices(sRemoveHost,iServiceNum,sServiceName);
end;

constructor MyBackUp.Create(CWVCLZIP:TVCLZip;FtpClient:TIdFTP;BackupRun:Boolean);
begin
  MyVCLZIP := CWVCLZIP;
  MyFtpClient := FtpClient;
  inherited Create(BackupRun);//False线程建立立即执行
end;

procedure MyBackUp.Execute;
var
  nTemp : Integer;
  bCHK  : Boolean;
//  Year, Month, Day, Hour, Min, Sec, MSec: Word;
  Hour, Min, Sec, MSec: Word;
//  iRet  : LongInt;
begin
  //线程循环检查是否到了备份时间
  while not Terminated do begin
    sRemoveHost := '';
    bCHK := True;
    //DecodeDate(Now,Year,Month,Day);
    DecodeTime(Now,Hour,Min,Sec,MSec);

    //是否指定时间
    if ((iBackUpHour = Hour) and (iBackUpMinute = Min)) then
    begin
      pvbBackUpRunning := True;
      //开始备份
      case iBackUpScheme of
      //每日备份
      0: bCHK := BackUP;
      1://单日备份
        begin
          nTemp := StrToInt(FormatDateTime('dd',Now));
          if (nTemp mod 2) <> 0 then bCHK := BackUP;
        end;
      2://双日备份
        begin
          nTemp := StrToInt(FormatDateTime('dd',Now));
          if (nTemp mod 2) = 0 then bCHK := BackUP;
        end;
      3://每周备份,定周日备份
        begin
          //1是星期天
          if (DayOfWeek(Now) = 1) then bCHK := BackUP;
        end;
      4://每月备份,定每月1日备份
        begin
          nTemp := StrToInt(FormatDateTime('dd',Now));
          //if (DayOfTheMonth(Now) = 1) then bCHK := BackUP;
          if (nTemp = 1) then bCHK := BackUP;
        end;
      end;
      {
      //备份成功检查已经备份的份数,删除过期的备份
      if bCHK then DelBackUpFile(iBackUpCopy,sBFML) else if nIMResult = 0 then begin
        iRet := IM_SendSM('CW自动备份失败!','',0,pvsIM_Phone);
        if iRet < 0 then  LogAlarmToText('发送短信失败,返回代码:' + IntToStr(iRet) + '。');
      end;
      }
      pvbBackUpRunning := False;
      //动态释放内存
      if bFreeMemory then FreeSystemMemory;
    end;
    Sleep(20000);//休眠20秒
  end;
  LogAlarmToText('CW自动备份线程停止。');
end;

procedure TCW_Auto_Backup.VCLZipCWFileNameForSplitPart(Sender: TObject;
  var FName: String; PartNum: Integer; SplitType: TSplitPartType);
begin
  if (VCLZipCW.BlockMode = bmStandard) then
    begin
      if (SplitType = spLast) then
        FName := VCLZipCW.ZipName + '.zip'
      else
        FName := VCLZipCW.ZipName + '.' + Format('z%2.2d', [PartNum]);
    end
  else
      FName := VCLZipCW.ZipName + '.ZIP.' + Format('%3.3d', [PartNum]);
end;

procedure TCW_Auto_Backup.ServiceCreate(Sender: TObject);
var
  iReturn:Integer;
begin
  //设置日期与时间的格式,避免因系统设置不同取日期时间错误
  DateSeparator := '-';
  ShortDateFormat := 'yyyy-mm-dd';
  LongDateFormat := 'yyyy-mm-dd';
  TimeSeparator := ':';
  ShortTimeFormat := 'hh:nn:ss';
  LongTimeFormat := 'hh:nn:ss';

  //设置路径
  ChDir(ExtractFilePath(Paramstr(0)));

  //读配置文件
  ReadIniFile;

  //加载短信网关驱动
  iReturn := IM_Init(pvsIM_IP,pvsIM_UserName,pvsIM_UserPassword,pvsIM_ApiName);
  if iReturn = 0 then LogAlarmToText('装载ImApi.DLL失败!') else
      LogAlarmToText('装载ImApi.DLL成功!');
  if nIMResult = 0 then LogAlarmToText('短信网关初始化成功!') else
    if nIMResult = -999 then
      LogAlarmToText('ImApi.dll丢失,短信功能禁止!')
    else
      LogAlarmToText('短信网关初始化失败!错误代码为:'+ IntToStr(nIMResult)+'。');

end;

procedure TCW_Auto_Backup.ServiceStart(Sender: TService;
  var Started: Boolean);
var
  iRet:LongInt;
begin
  //CW备份服务启动立即创建线程并执行
  pvbBackUpRunning := False;
  BackUpThread := MyBackUp.Create(VCLZipCW,CWFtpClient,False);
  if BackUpThread <> nil then
    begin
      LogAlarmToText('CW自动备份线程启动。');
      if nIMResult = 0 then begin
        iRet := IM_SendSM('CW自动备份线程启动!','',0,pvsIM_Phone);
        if iRet < 0 then LogAlarmToText('发送短信失败,返回代码:' + IntToStr(iRet) + '。');
      end;
    end
  else begin
    LogAlarmToText('CW自动备份线程启动失败!');
    if nIMResult = 0 then begin
      iRet := IM_SendSM('CW自动备份线程启动失败!','',0,pvsIM_Phone);
      if iRet < 0 then LogAlarmToText('发送短信失败,返回代码:' + IntToStr(iRet) + '。');
    end;
  end;

  //服务守护线程启动
  WatchThread := MyWatch.Create(VCLZipCW,CWFtpClient,False);
  if WatchThread <> nil then
    LogAlarmToText('CW服务守护线程启动。')
  else begin
    LogAlarmToText('CW服务守护线程启动失败!');
  end;

  //FTP备份服务线程启动
  FtpClientThread := MyFtpClient.Create(CWFtpClient,False);
  if WatchThread <> nil then
    LogAlarmToText('FTP备份线程启动。')
  else begin
    LogAlarmToText('FTP备份线程启动失败!');
  end;

end;

procedure TCW_Auto_Backup.ServiceStop(Sender: TService;
  var Stopped: Boolean);
var
  iRet: LongInt;
begin
  //停止备份线程
  BackUpThread.Terminate;

  //停止服务守护线程
  WatchThread.Terminate;
  //停止FTP备份线程
  FtpClientThread.Terminate;

  //短信通知自动备份、短信转服务停止
  if nIMResult =0 then begin
    iRet := IM_SendSM('CW自动备份服务停止!','',0,pvsIM_Phone);
    if iRet < 0 then LogAlarmToText('发送短信失败,返回代码:' + IntToStr(iRet) + '。');
  end;
end;

procedure TCW_Auto_Backup.CWFtpClientStatus(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: String);
begin
  case AStatus of
    hsResolving: LogAlarmToText('FTP Status:Resolving');
    hsConnecting: LogAlarmToText('FTP Status:Connecting');
    hsConnected: LogAlarmToText('FTP Status:Connected');
    hsDisconnecting: LogAlarmToText('FTP Status:Disconnecting');
    hsDisconnected: LogAlarmToText('FTP Status:Disconnected');
    hsStatusText: LogAlarmToText('FTP Status:StatusText=' + AStatusText);
    //ftpTransfer: LogAlarmToText('FTP Status:Transfer');
    //ftpReady: LogAlarmToText('FTP Status:Ready');
    ftpAborted: LogAlarmToText('FTP Status:Aborted');
  end;
end;

procedure TCW_Auto_Backup.CWFtpClientWorkBegin(ASender: TObject;
  AWorkMode: TWorkMode; AWorkCountMax: Integer);
begin
  LogAlarmToText('开始上传...');
end;

procedure TCW_Auto_Backup.CWFtpClientWorkEnd(ASender: TObject;
  AWorkMode: TWorkMode);
begin
  LogAlarmToText('上传结束.');
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -