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

📄 unit_main.~pas

📁 根据配置文件取的升级的Url地址自动下载文件升级程序
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
      //计算要接收的长度_end;
      //头信息收完了
      if cmd1 = #13#10 then break;
    end;
    real_reclen1 := 0;
    while Form_Update.ClientSocket1.Active = true do
    begin
      if Form_Update.stop1 = true then break;
      //不能接收则退出
      if Form_Update.can_rec1 = false then break;
      //如果文件当前的长度大于服务器标识的长度,则是出错了,不要写入文件中
      if filesize(f1) >= total_len1 then
      begin
        //showmessage('文件已经下载完毕了!');
        result := true;
        Form_Update.Memo1.Lines.Add(file1 + '文件下载完成' + #13#10);
        break;
      end;
      zeromemory(@buf1, sizeof(buf1));
      rec1 := Form_Update.ClientSocket1.Socket.ReceiveBuf(buf1, sizeof(buf1));
      //如果实际收到的长度大于服务器标识的长度,则是出错了,不要写入文件中
      if real_reclen1 >= reclen1 then
      begin
        //showmessage('文件已经下载完毕了!');
        result := true;
        Form_Update.Memo1.Lines.Add(Form_update.serfilename + '实际收到文件长度大于服务器标识长度,跳过下载' + #13#10);
        break;
      end;
      //如果当前的长度大于服务器标识的长度,则是出错了,不要写入文件中
      if pos1 = reclen1 then
      begin
        //showmessage('文件已经下载完毕了!');
        result := true;
        Form_Update.Memo1.Lines.Add(Form_update.serfilename + '当前长度大于服务器标识长度,跳过下载' + #13#10);
        break;
      end;
      blockwrite(f1, buf1, rec1);
      real_reclen1 := real_reclen1 + rec1;

      //显示下载进度
      Form_Update.Label4.Caption := '共 ' + FormatFloat('#,##', reclen1) + ' 字节,已下载 ' + FormatFloat('#,##', real_reclen1) + ' 字节';
      Form_Update.Gauge_process.MaxValue := reclen1;
      Form_Update.Gauge_process.Progress := real_reclen1;
      Form_update.Notebook_step.Refresh;
      application.ProcessMessages;
    end;
    closefile(f1);
    //发送get请求,以得到实际的文件数据_end;
    Form_Update.ClientSocket1.Active := false;
  except
    closefile(f1);
    //showmessage('连接失败...');
    result := false;
    Form_Update.Memo1.lines.add(Form_update.serfilename + '服务器连接失败,取消下载' + #13#10);
  end;
end;
procedure TForm_Update.btn_nextClick(Sender: TObject);
var i: integer;
  run_exe, host1, file1: string;
  Flist: TListItem;
  //myblob: TStream;
  fd: Tdatetime;
  allget:boolean;
begin
  if btn_next.Caption = '完成升级' then
  begin
    btn_next.Enabled := false;
    btn_next.Caption := '复制新文件..';
    button2.Enabled := false;
    //复制文件更新
    for i := 0 to files.Count - 1 do
    begin
      //备份一份文件出来到backup
      copyfile(pchar(g_path + files[i]), pchar(g_path + 'backup\' + files[i] + '.bak'), false);
    end;
    //从update复制新文件
    for i := 0 to files.Count - 1 do
    begin
      //替换复制文件
      copyfile(pchar(g_path + 'update\' + files[i]), pchar(g_path + files[i]), false);
      //删除update目录中的升级文件
      DeleteFile(pchar(g_path + 'update\' + files[i]));
    end;
    try
      AppIni := TIniFile.Create(g_path + 'gt.ini');
      run_exe := AppIni.ReadString('Gt', 'exe', '');
      if run_exe <> '' then
         shellexecute(handle, 'open', pchar(run_exe), nil, nil, SW_SHOWNORMAL);
    finally
      AppIni.Free;
    end;
    application.Terminate;
    exit;
  end;
  Notebook_step.PageIndex := Notebook_step.PageIndex + 1;

  Gauge_process.MaxValue := 100;
  Gauge_process.Progress := 0;
  ListView_files.Items.Clear;
  Flist := ListView_files.Items.Add;
  Flist.Caption := '分析文件升级信息...';
  Flist.StateIndex := 0;
  Flist.ImageIndex := 0;

  if ExistNewFile then //如果存在升级信息
  begin
    ListView_files.Items.Clear;
    Gauge_process.Progress := 0;
    for i := 0 to files.Count - 1 do
    begin
      Flist := ListView_files.Items.Add; //把待升级文件信息写入列表
      Flist.Caption := files[i];
      Flist.StateIndex := -1;
      Flist.ImageIndex := -1;
    end;
    //下载升级文件
    btn_next.Enabled := false;
    btn_next.Caption := '正下载文件..';
    button2.Enabled := true;
    try
      AppIni := TIniFile.Create(g_path + 'update\update.ini');
      for i := 0 to files.Count - 1 do
      begin
        ListView_files.Items[i].StateIndex := 0;
        ListView_files.Items[i].ImageIndex := 0;
        listview_files.Items[i].SubItems.Add(appini.ReadString(files[i], 'datetime', ''));
        host1 := Edt_url.Text + files[i];
        file1 := g_path + 'update\' + files[i];
        memo1.Lines.Add('连接远程文件:' + host1 + #13#10);
        if getfiledate(files[i], fd) then
        begin
          if fd < strtodatetime(Appini.ReadString(files[i], 'datetime', '')) then
          begin
            listview_files.Items[i].SubItems.Append('需要升级');
            if Download(host1, file1) then
            begin
              allget:=true;
              ListView_files.Items[i].StateIndex := 1;
              ListView_files.Items[i].ImageIndex := 1;
            end
            else
            begin
              allget:=false;
              ListView_files.Items[i].StateIndex := 2;
              ListView_files.Items[i].ImageIndex := 2;
            end;
          end
          else
          begin
            allget:=true;
            listview_files.Items[i].SubItems.Append('不需更新');
            ListView_files.Items[i].StateIndex := 3;
            ListView_files.Items[i].ImageIndex := 3;
            memo1.Lines.Add(listview_files.Items[i].Caption+'文件不需要更新,跳过下载'+#13#10);
          end;
        end
        else
        begin
          listview_files.Items[i].SubItems.Append('需要创建');
          if Download(host1, file1) then
          begin
            allget:=true;
            ListView_files.Items[i].StateIndex := 1;
            ListView_files.Items[i].ImageIndex := 1;
          end
          else
          begin
            allget:=false;
            ListView_files.Items[i].StateIndex := 2;
            ListView_files.Items[i].ImageIndex := 2;
          end;
        end;

      end;
    finally
      button2.Enabled := false;
      AppIni.Free;
      HTTPfiles.Disconnect;
    end;
    btn_next.Enabled := true;
    sj:=sj or allget;
    if (Notebook_step.PageIndex = Notebook_step.Pages.Count - 1) and sj then btn_next.Caption := '完成升级' else btn_next.Caption:='继续下载';
  end;
end;

procedure TForm_Update.Notebook_stepPageChanged(Sender: TObject);
begin
  if Notebook_step.PageIndex = 0 then
  begin
    btn_pre.Enabled := false;
    btn_next.Caption := '下一步';
    btn_next.Enabled := true;
  end
  else btn_pre.Enabled := true;
end;

procedure TForm_Update.btn_preClick(Sender: TObject);
begin
  button2.Click;
  try
    HTTPFiles.Disconnect;
  except
  end;
  Notebook_step.PageIndex := Notebook_step.PageIndex - 1;
  btn_next.Caption := '下一步';
  btn_next.Enabled := true;
end;

procedure TForm_Update.ListBox_serversClick(Sender: TObject);
var i: integer;
begin
  Edt_url.Text := '';
  for i := 0 to ListBox_servers.Items.Count - 1 do
    if ListBox_servers.Selected[i] then
    begin
      try
        AppIni := TIniFile.Create(g_path + '\GT.ini');
        Edt_url.Text := AppIni.ReadString('update', ListBox_servers.Items[i], 'http://');
      finally
        AppIni.Free;
      end;
    end;
end;

procedure TForm_Update.FormShow(Sender: TObject);
begin
  btn_next.SetFocus;
end;

procedure TForm_Update.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  try
    HTTPFiles.Disconnect;
  except
  end;
  files.Free;
end;

function TForm_Update.ExistNewFile: Boolean;
var i {, iFileHandle}: integer;
  {FileDateTime: TDateTime;}
  filestr: TStringList;
begin
  result := false;
  filestr := TStringList.Create;
  //下载文件
  files.Clear;
  try
    if copy(Edt_url.Text, length(Edt_url.Text), 1) <> '/' then Edt_url.Text := Edt_url.Text + '/';
    filestr.Add(HTTPFiles.Get(Edt_url.Text + sys_id + '.htm'));
    filestr.SaveToFile(g_path + 'update\update.ini');
    filestr.Free;
  except
    MessageBox(handle, '取得升级信息出错!', '错误提示', MB_OK + MB_ICONERROR);
    exit;
  end;
  files.Clear;
  try
    AppIni := TIniFile.Create(g_path + '\update\update.ini');
    AppIni.ReadSections(files);
  finally
    AppIni.Free;
  end;
  result := true;
end;

procedure TForm_Update.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := true;
  if HTTPFiles.Connected then
  begin
    if MessageBox(handle, '正在下载文件,要退出吗?', '信息提示', MB_YESNO + MB_ICONQUESTION) = ID_YES then CanClose := true else CanClose := false;
  end;
  if btn_next.Caption = '完成升级' then
  begin
    if MessageBox(handle, '文件下载已经完成,但并没有更新文件,要退出吗?', '信息提示', MB_YESNO + MB_ICONQUESTION) = ID_YES then CanClose := true else CanClose := false;
  end;
end;

procedure TForm_Update.Button1Click(Sender: TObject);
begin
  if self.Height = 280 then self.Height := 438 else self.Height := 280;
end;

procedure TForm_Update.Button2Click(Sender: TObject);
begin
  sj:=false;
  self.stop1 := true;
  memo1.Lines.Add('已中断下载;' + #13#10);
end;

procedure TForm_Update.FormActivate(Sender: TObject);
begin
  self.Height := 280;
end;

end.

⌨️ 快捷键说明

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