自动更新代码

unit u_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls,IniFiles,
   ShellApi,Math;

type
  TFrMain = class(TForm)
    idftp2: TIdFTP;
    btnUpgrade: TBitBtn;
    btnExit: TBitBtn;
    pnl1: TPanel;
    lblVer: TLabel;
    lbl1: TLabel;
    lv1: TListView;
    mmo1: TMemo;
    pb1: TProgressBar;
    procedure btnUpgradeClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure idftp2Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
  private
    AppPath,HostIp,User,UserPwd,DownLoadPath:string;
    HostPort,pIdx:Integer;
    procedure ReadIni;      //读取FTP配置文件
    procedure FtpConnection;   //连接FTP
    procedure FtpDisConnection;  //断开FTP
    procedure DownloadFiles(Source,Target: string);   //下载文件
    procedure DownLoadFilesList(Ver:string);   //下载文件列表
    procedure DonwLoadVerInfo;   //下载版本信息
    function  DetectVer:string;  //检测版本
    procedure ReadPEVer;         //读取当前程序版本
    function  GetFileSize(filename:string):string;    //获取文件的大小
    procedure StartDownload;       //开始下载
    procedure writever;           //保存更新后的版本号
    procedure AfterRun;           //下载后完成运行
    procedure AddShowInfo(act:string);    //显示详细 操作
    procedure BtState;              //按钮状态
    procedure PrgShow(Pos,Max:Integer); //进度条
    procedure WriteError(Err:string);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrMain: TFrMain;
const
  VerFile='DVerInfo.dat';
  DFileList='FList.dat';
implementation


{$R *.dfm}

{ TFrMain }

procedure TFrMain.FtpConnection;
begin
  FtpDisConnection;
  try
    with idftp2 do
    begin
      Host:=HostIp;
      Port:=HostPort;
      Username:=User;
      Password:=UserPwd;
      Connect();
    end
  except
    on E:Exception do
      begin
        WriteError(e.Message);
        ShowMessage('Connection Error!');
        Application.Terminate;
      end;  
  end;  
end;

procedure TFrMain.FtpDisConnection;
begin
  idftp2.Disconnect;
end;

procedure TFrMain.btnUpgradeClick(Sender: TObject);
begin
  StartDownload;
end;

procedure TFrMain.btnExitClick(Sender: TObject);
begin
  Close;
end;

procedure TFrMain.DonwLoadVerInfo;
begin
  AddShowInfo('verify the Version,please wait...');
  try
    DownloadFiles(VerFile,DownLoadPath+VerFile);
  except
    on E:Exception do
      begin
        WriteError(e.Message);
        ShowMessage('Failed:download version.');
      end;  
  end;  
end;

procedure TFrMain.ReadIni;
var
  Ini:TIniFile;
begin
  Ini:=TIniFile.Create(AppPath+'\ftpSvr.ini');
  try
    HostIp:=Ini.ReadString('Ftpinfo','HostIp','');
    HostPort:=Ini.ReadInteger('Ftpinfo','HostPort',0);
    User:=Ini.ReadString('Ftpinfo','User','');
    UserPwd:=Ini.ReadString('Ftpinfo','UserPwd','');
    DownLoadPath:=Ini.ReadString('Ftpinfo','DownLoadPath','');
  finally
    Ini.Free;
  end;  
end;

procedure TFrMain.FormCreate(Sender: TObject);
begin
  AppPath:=ExtractFilePath(Application.ExeName);
  ReadPEVer;
  ReadIni;
  Application.Title:=Caption;
end;

procedure TFrMain.ReadPEVer;
var
  VerData:TStringList;
  Vertxt:string;
begin
  Vertxt:=AppPath+'\Ver.txt';
  if not FileExists(Vertxt) then
     begin
       ShowMessage('Failed:Read the version.');
       Close;
     end;
  VerData:=TStringList.Create;
  try
    VerData.LoadFromFile(Vertxt);
    lblVer.Caption:=VerData.Strings[0];
  finally
    VerData.Free;
  end;
end;

procedure TFrMain.DownloadFiles(Source,Target: string);
begin
  try
   try
    FtpConnection;
    idftp2.ChangeDir('/');
    idftp2.ChangeDirUp;
    idftp2.Get(Source,Target,True);
   except
     on E:Exception do
        WriteError(e.Message);
   end;
  finally
   FtpDisConnection;
  end; 
end;

function TFrMain.DetectVer: string;
var
  DataList:TStringList;
begin
  if not FileExists(DownLoadPath+VerFile) then
    begin
//     ShowMessage('');
     Exit;
    end;
  DataList:=TStringList.Create;
  try
    DataList.LoadFromFile(DownLoadPath+VerFile);
    Result:=DataList.Values[lblVer.Caption]
  finally
    DataList.Free;
  end;
end;

procedure TFrMain.DownLoadFilesList(Ver:string);
begin
  try
    AddShowInfo('Downloading file list.');
    DownloadFiles(Ver+'\'+DFileList,DownLoadPath+DFileList);
    AddShowInfo('OK:Downloading file list.');
  except
     on E:Exception do
        WriteError(e.Message);
    
  end;
end;

procedure TFrMain.StartDownload;
var
  Ver,SourceFilename,TargerFilename,AfterRp:string;
  DataList:TStringList;
  Idx,FileCount:Integer;
begin
  lv1.Clear;
  mmo1.Clear;
  DonwLoadVerInfo;
  Ver:=Trim(DetectVer);
  if Ver='' then
    begin
     if not DeleteFile(AppPath+DownLoadPath+VerFile) then
         ShowMessage('VerFile is not exsist.')
     else
         ShowMessage('No update.');
     Close;
     Exit;
    end;
  AddShowInfo('Old Version:'+lblVer.Caption+',New Version:'+Ver);
  DownLoadFilesList(Ver);     //下载对应版本的文件列表
  DataList:=TStringList.Create;
  AddShowInfo('Download files,please wait...');
  try
    BtState;
    DataList.LoadFromFile(AppPath+DownLoadPath+DFileList);
    FileCount:=StrToInt(DataList.Values['FileCount']);
    AfterRp:=DataList.Values['AfterRun'];
    pb1.Position:=0;
    FtpConnection;
    for Idx:=0 to FileCount-1 do
     begin
        SourceFilename:=DataList.Values['File'+InttoStr(Idx)];
        TargerFilename:=DownLoadPath+SourceFilename;
        pIdx:=Idx;
        if AfterRp<>SourceFilename then
        begin
         with lv1 do
          begin
           Items.Add;
           Items.Item[Idx].Caption:=SourceFilename;
           Items.Item[Idx].SubItems.Add(GetFileSize(Ver+'\'+SourceFilename));
           Items.Item[Idx].SubItems.Add('Downloading...');
           PrgShow(Idx+1,FileCount);
           Application.ProcessMessages;
          end;
         end; 
        try
          idftp2.Get(Ver+'\'+SourceFilename,TargerFilename,True);
         if AfterRp<>SourceFilename then
            lv1.Items.Item[Idx].SubItems.Strings[1]:='OK';
          Application.ProcessMessages;
        except
          lv1.Items.Item[Idx].SubItems.Strings[1]:='Failed';
        end;  
     end;
    writever;
    AddShowInfo('OK:Download files.');
    AfterRun; 
  finally
    DataList.Free;
    FtpDisConnection;
    BtState;
  end;
end;

procedure TFrMain.writever;
var
  DataList:TStringList;
  Ver:string;
begin
  if not idftp2.Connected then Exit;
  DataList:=TStringList.Create;
  Ver:=DetectVer;
  try
    DataList.LoadFromFile(AppPath+'Ver.txt');
    DataList.Clear;
    DataList.Add(Ver);
    DataList.SaveToFile(AppPath+'Ver.txt');
    lblVer.Caption:=Ver;
  finally
    DataList.Free;
  end;
end;

procedure TFrMain.AfterRun;
var
  DataList:TStringList;
  strExe:string;
begin
  DataList:=TStringList.Create;
  try
    DataList.LoadFromFile(AppPath+DownLoadPath+DFileList);
    strExe:=Downloadpath+DataList.Values['AfterRun'];
    ShellExecute(Handle,'',PChar(strExe),'','',SW_NORMAL);
    Close;
  finally
    DataList.Free;
  end;
end;


function TFrMain.GetFileSize(filename:string): string;
var
  size1:Double;
begin
  size1:=idftp2.Size(filename)/1024;
  Result:=VarToStr(size1);
end;

procedure TFrMain.idftp2Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  lv1.Items.Item[pIdx].SubItems.Strings[1]:=
     VarToStr(AWorkCount/1024);
     Application.ProcessMessages;
end;

procedure TFrMain.AddShowInfo(act: string);
begin
  mmo1.Lines.Add('Time:'+DateTimeToStr(Now)+',operation:'+act);
  Application.ProcessMessages;
end;

procedure TFrMain.BtState;
begin
  btnUpgrade.Enabled:=not btnUpgrade.Enabled;
  btnExit.Enabled:=not btnExit.Enabled;
end;

procedure TFrMain.PrgShow(Pos, Max: Integer);
begin
    pb1.Position:=Floor(Pos*100/Max);
    Application.ProcessMessages;
end;

procedure TFrMain.WriteError(Err: string);
var
  MyFile:TextFile;
  ErrFile:string;
begin
  ErrFile:=AppPath+'err.log';
  try
   AssignFile(MyFile,ErrFile);
   if FileExists(ErrFile) then
      Append(MyFile)
   else
      Rewrite(MyFile);
   writeln(MyFile,'Time:'+DateTimeToStr(Now)+',ErrorMsg:'+err);   
  finally
   CloseFile(MyFile);
  end;
end;

end.

posted on 2011-11-10 19:41  舟山牙医  阅读(330)  评论(0)    收藏  举报

导航