ufrmmain.pas

来自「数据自动备份系统的简易实现,DELPHI实现.」· PAS 代码 · 共 1,273 行 · 第 1/4 页

PAS
1,273
字号
unit UfrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, StdCtrls, ImgList, Buttons, RzButton, FileCtrl,
  DB, ADODB, OLEDB, DBLogDlg, AdoConEd, RecError, RzTray, Menus, Spin, StrUtils,
  RzPanel, RzTabs, RzRadGrp, IniFiles, IdBaseComponent, IdComponent, IdFTPCommon,
  IdTCPConnection, IdTCPClient, IdFTP;

type
  TfrmMain = class(TForm)
    PanelClient: TRzPanel;
    TaskImages: TImageList;
    SystemTimer: TTimer;
    TaskTimer: TTimer;
    Timer1: TTimer;
    ADOConn: TADOConnection;
    TrayIcon: TRzTrayIcon;
    pmTaskMenu: TPopupMenu;
    N4: TMenuItem;
    qryCommand: TADOQuery;
    Panel2: TRzPanel;
    PanelContent: TRzPanel;
    SystemLog: TRichEdit;
    PanelTask: TRzPanel;
    StatusBar1: TStatusBar;
    Splitter1: TSplitter;
    LvTaskList: TListView;
    RzToolbar1: TRzToolbar;
    ImageList1: TImageList;
    BtnStart: TRzToolButton;
    BtnStop: TRzToolButton;
    RzSpacer1: TRzSpacer;
    BtnExit: TRzToolButton;
    RzPanel1: TRzPanel;
    RzPageControl1: TRzPageControl;
    TabSheet1: TRzTabSheet;
    TabSheet2: TRzTabSheet;
    RzPanel2: TRzPanel;
    Label1: TLabel;
    TxtTaskName: TEdit;
    cmbBackupType: TComboBox;
    cmbSaveType: TComboBox;
    TxtBackupDest: TEdit;
    Label6: TLabel;
    Label5: TLabel;
    btnBrowerOption: TRzBitBtn;
    Label4: TLabel;
    Label7: TLabel;
    TxtSavePath: TEdit;
    btnBrowerPath: TRzBitBtn;
    btnNewTask: TRzBitBtn;
    btnDelTask: TRzBitBtn;
    rgTaskTime: TRadioGroup;
    dtpTaskTimeByDay: TDateTimePicker;
    sTxtTaskTimeByHour: TSpinEdit;
    sTxtTaskTimeByMinute: TSpinEdit;
    sTxtTaskTimeBySecond: TSpinEdit;
    RzPanel3: TRzPanel;
    Label2: TLabel;
    Label3: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    TxtFTPServerIP: TEdit;
    TxtFTPServerPort: TEdit;
    TxtFTPUserName: TEdit;
    TxtFTPPassword: TEdit;
    btnSysOption: TRzBitBtn;
    Label10: TLabel;
    TxtFTPFileDir: TEdit;
    UpdateFTP: TIdFTP;
    Label11: TLabel;
    btnModifyTask: TRzBitBtn;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Label12: TLabel;
    cmbBackupWay: TComboBox;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnNewTaskClick(Sender: TObject);
    procedure btnDelTaskClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SystemTimerTimer(Sender: TObject);
    procedure TaskTimerTimer(Sender: TObject);
    procedure btnBrowerOptionClick(Sender: TObject);
    procedure btnBrowerPathClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure rgTaskTimeClick(Sender: TObject);
    procedure BtnStartClick(Sender: TObject);
    procedure BtnStopClick(Sender: TObject);
    procedure BtnExitClick(Sender: TObject);
    procedure btnSysOptionClick(Sender: TObject);
    procedure UpdateFTPWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure UpdateFTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure UpdateFTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    procedure UpdateFTPStatus(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
    procedure btnModifyTaskClick(Sender: TObject);
    procedure LvTaskListDblClick(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure cmbSaveTypeChange(Sender: TObject);
  private
    { Private declarations }
    //获取执行时间
    procedure GetTaskTimeAndType(out TaskTimeValue: string; out TaskType: string);
    //新增任务
    procedure DoAppendTask;
    //删除任务
    procedure DoDeleteTask;
    //修改任务
    procedure DoModifyTask;
    //错误信息
    procedure DoShowErrorMessageDlg(sMessage: string);
    //读取备份任务列表
    procedure DoLoadTaskList;
    //保存备份任务列表
    procedure DoSaveTaskList;
    //备份引擎
    procedure DoBackup(iBackupType, iSaveType: Integer; sBackupDest, sSavePath, sLastBackupTime, sBackupWay: string);
    //日志信息
    procedure DoSystemLog(sLogMsg: string);
    {用递归的方法遍历文件}
    function EnumFileInRecursion(path: PChar; OutList: TStrings; sDateTime: string):Longint;
    //获取文件时间
    function GetFileLastModifyDateTime(sFileName: string): TDateTime;
    //备份数据库
    function DoBackupDB(sConnectionString, sSavePath, sFTPServerPath, sBackupWay: string; iSaveType: Integer): Boolean;
    //读取FTP参数
    procedure DoLoadFTPParams;
    //保存FTP参数
    procedure DoSaveFTPParams;
    //上传文件到FTP服务器
    function DoPostFileToFTP(sLocalFileName, sServerFileDir, sBackupWay: string): Boolean;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  TaskIDList: TStrings;
implementation

{$R *.dfm}

{用递归的方法遍历文件}
function TfrmMain.EnumFileInRecursion(path: PChar; OutList: TStrings; sDateTime: string):Longint;
var
    searchRec:TSearchRec;
    found:Integer;
    tmpStr:String;
    //sModifyTime: string;
    //SysModifyTime: SYSTEMTIME;
    //dtModifyTime: TDateTime;
begin
    Result:=0; //查找结果(文件数)
    //加上搜索后缀,得到类似'c:\*.*' 、'c:\windows\*.*'的搜索路径
    tmpStr:=StrPas(path)+'\*.*';
    //在当前目录查找第一个文件、子目录
    found:=FindFirst(tmpStr,faAnyFile,searchRec);
    while found=0 do
    //找到了一个文件或目录后
    begin
        //如果找到的是个目录
        if (searchRec.Attr and faDirectory)<>0 then
        begin
            {在搜索非根目录(C:\、D:\)下的子目录时会出现'.','..'的"虚拟目录"
            大概是表示上层目录和下层目录吧。。。要过滤掉才可以}
            if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
            begin
                {由于查找到的子目录只有个目录名,所以要添上上层目录的路径
                searchRec.Name = 'Windows';tmpStr:='c:\Windows';
                加个断点就一清二楚了}
                tmpStr:=StrPas(path)+'\'+searchRec.Name;
                //自身调用,查找子目录,递归。。。。
                Result := Result + EnumFileInRecursion(PChar(tmpStr), OutList, sDateTime);
            end;
        end
        //如果找到的是个文件
        {这个也是递归的结束条件,结束条件对于理解递归来说,相当重要}
        else begin
            {Result记录着搜索到的文件数。可是我是用CreateThread创建线程
            来调用函数的,不知道怎么得到这个返回值。。。我不想用全局变量}
            Result:=Result+1;
            //FileTimeToLocalFileTime(searchRec.FindData.ftLastWriteTime, dtModifyTime);
            //FileTimeToSystemTime(searchRec.FindData.ftLastWriteTime, SysModifyTime);
            //dtModifyTime := SystemTimeToDateTime(SysModifyTime);
            //if dtModifyTime > StrToDateTime(sDateTime) then
            //把找到的文件加到Memo控件
            OutList.Add(StrPas(path)+'\'+searchRec.Name);
         end;
         //查找下一个文件或目录
        found:=FindNext(searchRec);
    end;
    //释放资源
    FindClose(searchRec);
end;

procedure TfrmMain.DoAppendTask;
var
  strTaskName, strBackupWay, strTaskTime, strTaskTimeType, strTaskType, strTaskSaveType, strTaskBackupDest, strSavePath: string;
  NewItem: TListItem;
begin
  //设置任务信息
  strTaskName := Trim(TxtTaskName.Text);
  GetTaskTimeAndType(strTaskTime, strTaskTimeType);
  strTaskType := Trim(cmbBackupType.Text);
  strTaskSaveType := Trim(cmbSaveType.Text);
  strTaskBackupDest := Trim(TxtBackupDest.Text);
  strSavePath := Trim(TxtSavePath.Text);
  strBackupWay := Trim(cmbBackupWay.Text);
  //验证任务信息
  if SameText('', strTaskName) then
  begin
    DoShowErrorMessageDlg('请设置[任务名称]信息!');
    Exit;
  end;
  if SameText('', strTaskType) then
  begin
    DoShowErrorMessageDlg('请设置[备份类型]信息!');
    Exit;
  end;
  if SameText('', strTaskSaveType) then
  begin
    DoShowErrorMessageDlg('请设置[保存方式]信息!');
    Exit;
  end;
  if SameText('', strTaskBackupDest) then
  begin
    DoShowErrorMessageDlg('请设置[备份目标]信息!');
    Exit;
  end;
  if SameText('', strSavePath) then
  begin
    if not SameText(cmbSaveType.Text, '异地备份-FTP') then
    begin
      DoShowErrorMessageDlg('请设置[保存目录]信息!');
      Exit;
    end;
  end;
  if SameText('', strBackupWay) then
  begin
    DoShowErrorMessageDlg('请设置[备份方式]信息!');
    Exit;
  end;
  //添加信息
  NewItem := LvTaskList.Items.Add;
  if SameText(strTaskType, '备份文件') or SameText(strTaskType, '备份目录') then NewItem.ImageIndex := 0
  else NewItem.ImageIndex := 1;
  NewItem.Caption := strTaskName;
  NewItem.SubItems.Add(strTaskTime);
  NewItem.SubItems.Add(strTaskType);
  NewItem.SubItems.Add(strTaskSaveType);
  NewItem.SubItems.Add(strTaskBackupDest);
  NewItem.SubItems.Add(strSavePath);
  NewItem.SubItems.Add(strTaskTimeType);
  if SameText(strTaskTimeType, '按天') then
    NewItem.SubItems.Add(DateTimeToStr(Now));
  if SameText(strTaskTimeType, '按时') then
    NewItem.SubItems.Add(DateTimeToStr(Now));
  if SameText(strTaskTimeType, '按分') then
    NewItem.SubItems.Add(DateTimeToStr(Now));
  if SameText(strTaskTimeType, '按秒') then
    NewItem.SubItems.Add(DateTimeToStr(Now));
  NewItem.SubItems.Add(strBackupWay);
  DoSystemLog('添加[' + strTaskName + ']任务信息成功.');
  //保存任务列表
  DoSaveTaskList;
end;

procedure TfrmMain.DoDeleteTask;
begin
  if LvTaskList.Items.Count = 0 then Exit;
  if LvTaskList.Selected <> nil then
  begin
    LvTaskList.DeleteSelected;
  end;
  //保存任务列表
  DoSaveTaskList;
end;

procedure TfrmMain.DoShowErrorMessageDlg(sMessage: string);
begin
  //显示错误对话框
  Application.MessageBox(PChar(sMessage), '错误', MB_OK + MB_ICONERROR);
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //显示询问对话框
  if Application.MessageBox('是否要退出数据自动备份软件?', '询问', MB_YESNO + MB_ICONQUESTION) <> IDYES then
  begin
    Abort;
  end;
  Timer1.Enabled := False;
  SystemTimer.Enabled := False;
  TaskTimer.Enabled := False;
  if TaskIDList <> nil then
  begin
    TaskIDList.Free;  //释放TaskIDList
  end;
end;

procedure TfrmMain.btnNewTaskClick(Sender: TObject);
begin
  if not btnStart.Enabled then  //判断启动按钮是否有效,如果无效则说明正在执行备份
  begin
    DoShowErrorMessageDlg('请先停止备份监视.');
    Exit;
  end;
  DoAppendTask;
end;

procedure TfrmMain.btnDelTaskClick(Sender: TObject);

⌨️ 快捷键说明

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