在线更新的实现1

首先是要有个能放更新文件的服务器,把要更新的文件放上去。然后做一个 xml 文件,用于保存更新文件的信息。对于一个文件,是否需要更新,采用 md5 的方式去判断。如果 md5 值相同,则表示是同一个文件,不需要再更新。

xml 生成工具的代码:


 

  1. unit frmMain;
  2. interface
  3. uses
  4.    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.    Dialogs, xmldom, XMLIntf, Menus, StdCtrls, msxmldom, XMLDoc, OBDragDrop,
  6.    ExtCtrls, MD5Real, ComCtrls, WinSkinData;
  7. type
  8.    TFormMain = class(TForm)
  9.      XML: TXMLDocument;
  10.      PopupMenu1: TPopupMenu;
  11.      N1: TMenuItem;
  12.      N2: TMenuItem;
  13.      N3: TMenuItem;
  14.      N4: TMenuItem;
  15.      N5: TMenuItem;
  16.      N6: TMenuItem;
  17.      N7: TMenuItem;
  18.      N9: TMenuItem;
  19.      MainMenu1: TMainMenu;
  20.      F1: TMenuItem;
  21.      XML1: TMenuItem;
  22.      XML3: TMenuItem;
  23.      N10: TMenuItem;
  24.      N11: TMenuItem;
  25.      N12: TMenuItem;
  26.      N13: TMenuItem;
  27.      N14: TMenuItem;
  28.      N20: TMenuItem;
  29.      H1: TMenuItem;
  30.      OBDragDrop1: TOBDragDrop;
  31.      odSelFile: TOpenDialog;
  32.      N21: TMenuItem;
  33.      N22: TMenuItem;
  34.      N23: TMenuItem;
  35.      Panel1: TPanel;
  36.      Label1: TLabel;
  37.      Splitter1: TSplitter;
  38.      Panel2: TPanel;
  39.      Label2: TLabel;
  40.      mmCommands: TMemo;
  41.      odOpenXml: TOpenDialog;
  42.      sdSaveXml: TSaveDialog;
  43.      lstUpdateFiles: TListView;
  44.      pmDir: TPopupMenu;
  45.      N15: TMenuItem;
  46.      N16: TMenuItem;
  47.      N17: TMenuItem;
  48.      N18: TMenuItem;
  49.      N8: TMenuItem;
  50.      N19: TMenuItem;
  51.      N24: TMenuItem;
  52.      SkinData1: TSkinData;
  53.      XML2: TMenuItem;
  54.      procedure OBDragDrop1Drop(Sender: TObject; Pos: TPoint;
  55.        Value: TStringList);
  56.      procedure N14Click(Sender: TObject);
  57.      procedure N9Click(Sender: TObject);
  58.      procedure lstUpdateFilesDblClick(Sender: TObject);
  59.      procedure N20Click(Sender: TObject);
  60.      procedure N12Click(Sender: TObject);
  61.      procedure XML1Click(Sender: TObject);
  62.      procedure FormCreate(Sender: TObject);
  63.      procedure XML2Click(Sender: TObject);
  64.      procedure XML3Click(Sender: TObject);
  65.      procedure N10Click(Sender: TObject);
  66.      procedure N18Click(Sender: TObject);
  67.      procedure N21Click(Sender: TObject);
  68.      procedure N23Click(Sender: TObject);
  69.      procedure N17Click(Sender: TObject);
  70.      procedure N15Click(Sender: TObject);
  71.      procedure N24Click(Sender: TObject);
  72.    private
  73.      FileName: string;
  74.    public
  75.      function GetFileSize(aFileName: string): integer;
  76.      procedure GenerateFileList;
  77.      procedure CopyFilesToUpdateDir(Files: TStrings);
  78.      function ValidateCommands: Boolean;
  79.    end;
  80. var
  81.    FormMain           : TFormMain;
  82.    fileList           : TStringList;
  83.    DirList            : TStringList;
  84. implementation
  85. {$R *.dfm}
  86. function TFormMain.GetFileSize(aFileName: string): integer;
  87. var
  88.    sr                 : TSearchRec;
  89. begin
  90.    if FindFirst(aFileName, faAnyFile, sr) = 0 then
  91.      Result := sr.Size
  92.    else
  93.      Result := 0;
  94.    FindClose(sr);
  95. end;
  96. procedure TFormMain.OBDragDrop1Drop(Sender: TObject; Pos: TPoint;
  97.    Value: TStringList);
  98. var
  99.    i                  : Integer;
  100.    node               : TListItem;
  101. begin
  102.    for i := 0 to Value.Count - 1 do
  103.    begin
  104.      //     if lstUpdateFiles.Items.Item[i].Caption = ExtractFileName(Value[i]) then
  105.      //       Continue;
  106.      node := Self.lstUpdateFiles.Items.Add;
  107.      node.Caption := ExtractFileName(Value[i]);
  108.      node.SubItems.Add(IntToStr(GetFileSize(Value[i])));
  109.      node.SubItems.Add(EmptyStr);
  110.      node.SubItems.Add(ExtractFileName(Value[i]));
  111.    end;
  112.    GenerateFileList;
  113.    CopyFilesToUpdateDir(Value);
  114. end;
  115. function TFormMain.ValidateCommands: Boolean;
  116. var
  117.    i                  : Integer;
  118.    n, t               : Integer;
  119. begin
  120.    // todo: validate commands
  121.    t := 0;
  122.    n := 0;
  123.    for i := 0 to mmCommands.Lines.Count - 1 do
  124.    begin
  125.      if Pos('stop', mmCommands.Lines[i]) > 0 then
  126.        n := 1;
  127.      if Pos('kill', mmCommands.Lines[i]) > 0 then
  128.        n := 2;
  129.      if (Pos('copy', mmCommands.Lines[i]) > 0or (Pos('delete', mmCommands.Lines[i]) > 0or (Pos('rename', mmCommands.Lines[i]) > 0then
  130.        n := 3;
  131.      if Pos('run', mmCommands.Lines[i]) > 0 then
  132.        n := 4;
  133.      if Pos('start', mmCommands.Lines[i]) > 0 then
  134.        n := 5;
  135.      if Pos('reboot', mmCommands.Lines[i]) > 0 then
  136.        n := 6;
  137.      if n < t then
  138.      begin
  139.        // 顺序出错
  140.        Result := False;
  141.        Exit;
  142.      end;
  143.      t := n;
  144.    end;
  145.    Result := True;
  146. end;
  147. procedure TFormMain.XML1Click(Sender: TObject);
  148. begin
  149.    // DONE: new file
  150.    self.XML.Active := False;
  151.    self.XML.XML.Clear;
  152.    lstUpdateFiles.Items.Clear;
  153.    mmCommands.Lines.Clear;
  154.    FileName := EmptyStr;
  155.    fileList.Clear;
  156.    DirList.Clear;
  157. end;
  158. procedure TFormMain.XML2Click(Sender: TObject);
  159. var
  160.    node               : IXMLNode;
  161.    detail             : IXMLNode;
  162.    str                : string;
  163.    li                 : TListItem;
  164. begin
  165.    // DONE: open xml
  166.    if not odOpenXml.Execute() then
  167.      Exit;
  168.    // open
  169.    FileName := odOpenXml.FileName;
  170.    self.XML.Active := False;
  171.    self.XML.XML.LoadFromFile(FileName);
  172.    self.XML.Active := True;
  173.    node := xml.DocumentElement;
  174.    if node = nil then
  175.      Exit;
  176.    lstUpdateFiles.Items.Clear;
  177.    node := node.ChildNodes.First;
  178.    while node <> nil do
  179.    begin
  180.      str := node.NodeName;
  181.      if str = 'file' then
  182.      begin
  183.        detail := node.ChildNodes[0];      // name
  184.        li := lstUpdateFiles.Items.Add;
  185.        li.Caption := detail.NodeValue;
  186.        detail := node.ChildNodes[1];      // size
  187.        li.SubItems.Add(detail.NodeValue);
  188.        detail := node.ChildNodes[2];      // dir
  189.        if detail.NodeValue = null then
  190.          li.SubItems.Add(EmptyStr)
  191.        else
  192.          li.SubItems.Add(detail.NodeValue);
  193.        detail := node.ChildNodes[4];
  194.        li.SubItems.Add(detail.NodeValue);
  195.        // detail := node.ChildNodes[2]; // md5
  196.      end;
  197.      // lstUpdateFiles.Items.Add(string(node.NodeValue));
  198.      if str = 'command' then
  199.        mmCommands.Lines.Add(string(node.NodeValue));
  200.      node := node.NextSibling;
  201.    end;
  202.    GenerateFileList;
  203. end;
  204. procedure TFormMain.XML3Click(Sender: TObject);
  205. var
  206.    node               : IXMLNode;
  207.    sub                : IXMLNode;
  208.    i                  : Integer;
  209.    sl                 : TStringList;
  210.    detail             : IXMLNode;
  211. begin
  212.    if not ValidateCommands then
  213.    begin
  214.      MessageBox(Handle, '控制指令顺序有误!不能保存!''提示', MB_OK or MB_ICONINFORMATION);
  215.      Exit;
  216.    end;
  217.    // DONE: save xml
  218.    if FileName = EmptyStr then
  219.    begin
  220.      N10Click(Self);
  221.      Exit;
  222.    end;
  223.    self.XML.Active := False;
  224.    self.XML.XML.Clear;
  225.    self.XML.Active := True;
  226.    node := self.XML.CreateNode('root');
  227.    self.XML.DocumentElement := node;
  228.    node := XML.DocumentElement;
  229.    for i := 0 to lstUpdateFiles.Items.Count - 1 do
  230.    begin
  231.      sub := node.AddChild('file');
  232.      detail := sub.AddChild('name');
  233.      detail.NodeValue := lstUpdateFiles.Items[i].Caption;
  234.      detail := sub.AddChild('size');
  235.      detail.NodeValue := lstUpdateFiles.Items[i].SubItems[0];
  236.      detail := sub.AddChild('dir');
  237.      try
  238.        detail.NodeValue := lstUpdateFiles.Items[i].SubItems[1];
  239.      except
  240.        detail.NodeValue := EmptyStr;
  241.      end;
  242.      detail := sub.AddChild('crc');
  243.      detail.NodeValue := MD5Real.RivestFile(fileList[i]);
  244.      detail := sub.AddChild('truename');
  245.      detail.NodeValue := lstUpdateFiles.Items[i].SubItems[2];
  246.    end;
  247.    for i := 0 to mmCommands.Lines.Count - 1 do
  248.    begin
  249.      sub := node.AddChild('command');
  250.      sub.NodeValue := mmCommands.Lines[i];
  251.    end;
  252.    sl := TStringList.Create;
  253.    sl.Text := FormatXMLData(xml.XML.Text);
  254.    sl.SaveToFile(FileName);
  255.    sl.Free;
  256. end;
  257. procedure TFormMain.N14Click(Sender: TObject);
  258. var
  259.    i                  : Integer;
  260.    node               : TListItem;
  261. begin
  262.    if not odSelFile.Execute then
  263.      Exit;
  264.    for i := 0 to odSelFile.Files.Count - 1 do
  265.    begin
  266.      node := lstUpdateFiles.Items.Add;
  267.      node.Caption := ExtractFileName(odSelFile.Files[i]);
  268.      node.SubItems.Add(IntToStr(GetFileSize(odSelFile.Files[i])));
  269.      node.SubItems.Add(EmptyStr);
  270.      node.SubItems.Add(ExtractFileName(odSelFile.Files[i]));
  271.    end;
  272.    GenerateFileList;
  273.    CopyFilesToUpdateDir(odSelFile.Files);
  274. end;
  275. procedure TFormMain.N15Click(Sender: TObject);
  276. var
  277.    str                : string;
  278. begin
  279.    if lstUpdateFiles.Items.Count = 0 then
  280.      Exit;
  281.    if lstUpdateFiles.ItemIndex = -1 then
  282.      Exit;
  283.    str := lstUpdateFiles.Items.Item[lstUpdateFiles.ItemIndex].SubItems[1];
  284.    str := InputBox('输入目录''输入文件更新到的目录:    ', str);
  285.    if str = EmptyStr then
  286.      Exit;
  287.    lstUpdateFiles.Items.Item[lstUpdateFiles.ItemIndex].SubItems[1] := str;
  288. end;
  289. procedure TFormMain.N17Click(Sender: TObject);
  290. begin
  291.    // todo: delete item
  292.    if lstUpdateFiles.Items.Count = 0 then
  293.      Exit;
  294.    if lstUpdateFiles.ItemIndex = -1 then
  295.      Exit;
  296.    lstUpdateFiles.Items.Delete(lstUpdateFiles.ItemIndex);
  297. end;
  298. procedure TFormMain.N18Click(Sender: TObject);
  299. begin
  300.    // todo: auto command
  301. end;
  302. procedure TFormMain.N9Click(Sender: TObject);
  303. var
  304.    str                : string;
  305.    str2               : string;
  306. begin
  307.    //
  308.    case TMenuItem(Sender).Tag of
  309.      1:
  310.        begin
  311.          // download
  312.          str := InputBox('输入文件名''输入要下载的文件名:     ',
  313.            EmptyStr);
  314.          if str <> EmptyStr then
  315.            mmCommands.Lines.Add(Format('/download "%s"', [str]));
  316.        end;
  317.      2:
  318.        begin
  319.          // update
  320.          str := InputBox('输入文件名''输入要更新的文件名:     ',
  321.            EmptyStr);
  322.          if str <> EmptyStr then
  323.            mmCommands.Lines.Add(Format('/update "%s"', [str]));
  324.        end;
  325.      3:
  326.        begin
  327.          // stop service
  328.          str := InputBox('输入服务名''输入要停止的服务名:     ',
  329.            EmptyStr);
  330.          if str <> EmptyStr then
  331.            mmCommands.Lines.Add(Format('/stop "%s"', [str]));
  332.        end;
  333.      4:
  334.        begin
  335.          // start service
  336.          str := InputBox('输入服务名''输入要启动的服务名:     ',
  337.            EmptyStr);
  338.          if str <> EmptyStr then
  339.            mmCommands.Lines.Add(Format('/start "%s"', [str]));
  340.        end;
  341.      5:
  342.        begin
  343.          // copy file
  344.          str := InputBox('输入文件名''输入原文件名:     ',
  345.            EmptyStr);
  346.          str2 := InputBox('输入文件名''输入新文件名:     ', EmptyStr);
  347.          if (str <> EmptyStr) and (str2 <> EmptyStr) then
  348.            mmCommands.Lines.Add(Format('/copy "%s" to "%s"', [str, str2]));
  349.        end;
  350.      6:
  351.        begin
  352.          // delete file
  353.          str := InputBox('输入文件名''输入要删除的文件名:     ',
  354.            EmptyStr);
  355.          if str <> EmptyStr then
  356.            mmCommands.Lines.Add(Format('/delete "%s"', [str]));
  357.        end;
  358.      7:
  359.        begin
  360.          // rename file
  361.          str := InputBox('输入文件名''输入原文件名:     ',
  362.            EmptyStr);
  363.          str2 := InputBox('输入文件名''输入新文件名:     ', EmptyStr);
  364.          if (str <> EmptyStr) and (str2 <> EmptyStr) then
  365.            mmCommands.Lines.Add(Format('/rename "%s" to "%s"', [str, str2]));
  366.        end;
  367.      8:
  368.        begin
  369.          // reboot software
  370.          str := InputBox('输入程序名''输入要重启的程序名:     ',
  371.            EmptyStr);
  372.          if str <> EmptyStr then
  373.            mmCommands.Lines.Add(Format('/restart "%s"', [str]));
  374.        end;
  375.      9:
  376.        begin
  377.          // reboot computer
  378.          mmCommands.Lines.Add('/reboot');
  379.        end;
  380.      10:
  381.        begin
  382.          str := InputBox('输入进程名''输入要停止的进程名称:      ', EmptyStr);
  383.          if str > EmptyStr then
  384.            mmCommands.lines.Add(Format('/kill "%s"', [str]));
  385.        end;
  386.      11:
  387.        begin
  388.          str := InputBox('输入进程名''输入要开始的进程名称:      ', EmptyStr);
  389.          if str > EmptyStr then
  390.            mmCommands.lines.Add(Format('/run "%s"', [str]));
  391.        end;
  392.    end;
  393. end;
  394. procedure TFormMain.FormCreate(Sender: TObject);
  395. begin
  396.    FileName := EmptyStr;
  397. end;
  398. procedure TFormMain.lstUpdateFilesDblClick(Sender: TObject);
  399. begin
  400.    if lstUpdateFiles.Items.Count = 0 then
  401.      Exit;
  402.    if lstUpdateFiles.ItemIndex = -1 then
  403.      Exit;
  404.    lstUpdateFiles.Items.Delete(lstUpdateFiles.ItemIndex);
  405. end;
  406. procedure TFormMain.N20Click(Sender: TObject);
  407. begin
  408.    if MessageBox(Handle, '确定要删除所有的更新文件吗?''提示', MB_YESNO or
  409.      MB_ICONINFORMATION) = idno then
  410.      Exit;
  411.    lstUpdateFiles.Items.Clear;
  412. end;
  413. procedure TFormMain.N21Click(Sender: TObject);
  414. begin
  415.    // todo: help
  416. end;
  417. procedure TFormMain.N23Click(Sender: TObject);
  418. begin
  419.    // todo : about
  420. end;
  421. procedure TFormMain.N24Click(Sender: TObject);
  422. var
  423.    str                : string;
  424. begin
  425.    if lstUpdateFiles.Items.Count = 0 then
  426.      Exit;
  427.    if lstUpdateFiles.ItemIndex = -1 then
  428.      Exit;
  429.    str := lstUpdateFiles.Items.Item[lstUpdateFiles.ItemIndex].SubItems[2];
  430.    str := InputBox('输入文件名''输入文件的真实文件名:    ', str);
  431.    if str = EmptyStr then
  432.      Exit;
  433.    lstUpdateFiles.Items.Item[lstUpdateFiles.ItemIndex].SubItems[2] := str;
  434. end;
  435. procedure TFormMain.N10Click(Sender: TObject);
  436. var
  437.    sl                 : TStringList;
  438.    i                  : Integer;
  439.    node               : IXMLNode;
  440.    sub                : IXMLNode;
  441.    detail             : IXMLNode;
  442. begin
  443.    if not ValidateCommands then
  444.    begin
  445.      MessageBox(Handle, '控制指令顺序有误!不能保存!''提示', MB_OK or MB_ICONINFORMATION);
  446.      Exit;
  447.    end;
  448.    // DONE: save as ...
  449.    if not sdSaveXml.Execute() then
  450.      Exit;
  451.    FileName := sdSaveXml.FileName;
  452.    self.XML.Active := False;
  453.    self.XML.XML.Clear;
  454.    self.XML.Active := True;
  455.    node := self.XML.CreateNode('root');
  456.    self.XML.DocumentElement := node;
  457.    node := XML.DocumentElement;
  458.    for i := 0 to lstUpdateFiles.Items.Count - 1 do
  459.    begin
  460.      sub := node.AddChild('file');
  461.      detail := sub.AddChild('name');
  462.      detail.NodeValue := lstUpdateFiles.Items[i].Caption;
  463.      detail := sub.AddChild('size');
  464.      detail.NodeValue := lstUpdateFiles.Items[i].SubItems[0];
  465.      detail := sub.AddChild('dir');
  466.      try
  467.        detail.NodeValue := lstUpdateFiles.Items[i].SubItems[1];
  468.      except
  469.        detail.NodeValue := EmptyStr;
  470.      end;
  471.      detail := sub.AddChild('crc');
  472.      detail.NodeValue := MD5Real.RivestFile(fileList[i]);
  473.      detail := sub.AddChild('truename');
  474.      detail.NodeValue := lstUpdateFiles.Items[i].SubItems[2];
  475.    end;
  476.    for i := 0 to mmCommands.Lines.Count - 1 do
  477.    begin
  478.      sub := node.AddChild('command');
  479.      sub.NodeValue := mmCommands.Lines[i];
  480.    end;
  481.    sl := TStringList.Create;
  482.    sl.Text := FormatXMLData(xml.XML.Text);
  483.    sl.SaveToFile(FileName);
  484.    sl.Free;
  485. end;
  486. procedure TFormMain.N12Click(Sender: TObject);
  487. begin
  488.    Close;
  489. end;
  490. procedure TFormMain.GenerateFileList;
  491. var
  492.    i                  : Integer;
  493. begin
  494.    fileList.Clear;
  495.    for i := 0 to lstUpdateFiles.Items.Count - 1 do
  496.    begin
  497.      fileList.Add(ExtractFilePath(ParamStr(0)) + '/Files/' +
  498.        lstUpdateFiles.Items[i].Caption);
  499.    end;
  500. end;
  501. procedure TFormMain.CopyFilesToUpdateDir(Files: TStrings);
  502. var
  503.    i                  : Integer;
  504. begin
  505.    //
  506.    for i := 0 to Files.Count - 1 do
  507.    begin
  508.      CopyFile(PChar(Files[i]), PChar(ExtractFilePath(ParamStr(0)) + '/Files/' +
  509.        ExtractFileName(Files[i])), False);
  510.    end;
  511. end;
  512. initialization
  513.    fileList := TStringList.Create;
  514.    DirList := TStringList.Create;
  515. finalization
  516.    fileList.Free;
  517.    DirList.Free;
  518. end.

生成完的 xml 命名为 update.xml,放到服务器上,与更新文件放在一起。

其实看到上面的代码也就明白了,这个更新可以选择执行指令,比如说要更新某个服务,必须先停止服务再更新,或是先终止某个程序再更新。更新完毕后,可以再次启动程序或服务。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值