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

📄 u_web_update.pas

📁 以前写的一个利用P2P 技术的一个通讯的例子。里面用到了 DBISAM 、INDY 控件。
💻 PAS
📖 第 1 页 / 共 2 页
字号:
            rec1 := F_WEB_UPDATE.ClientSocket1.Socket.ReceiveBuf(buf1, sizeof(buf1));
            //如果实际收到的长度大于服务器标识的长度,则是出错了,不要写入文件中
            if real_reclen1 >= reclen1 then
               begin
                  //showmessage('文件已经下载完毕了!');
                  result := true;
                  F_WEB_UPDATE.Memo1.Lines.Add(F_WEB_UPDATE.serfilename + '实际收到文件长度大于服务器标识长度,跳过下载' + #13#10);
                  break;
               end;
            //如果当前的长度大于服务器标识的长度,则是出错了,不要写入文件中
            if pos1 = reclen1 then
               begin
                  //showmessage('文件已经下载完毕了!');
                  result := true;
                  F_WEB_UPDATE.Memo1.Lines.Add(F_WEB_UPDATE.serfilename + '当前长度大于服务器标识长度,跳过下载' + #13#10);
                  break;
               end;
            blockwrite(f1, buf1, rec1);
            real_reclen1 := real_reclen1 + rec1;

            //显示下载进度
            F_WEB_UPDATE.Label4.Caption := '共 ' + FormatFloat('#,##', reclen1) + ' 字节,已下载 ' + FormatFloat('#,##', real_reclen1) + ' 字节';
            F_WEB_UPDATE.Gauge_process.MaxValue := reclen1;
            F_WEB_UPDATE.Gauge_process.Progress := real_reclen1;
            F_WEB_UPDATE.Notebook_step.Refresh;
            application.ProcessMessages;
         end;
      closefile(f1);
      //发送get请求,以得到实际的文件数据_end;
      F_WEB_UPDATE.ClientSocket1.Active := false;
   except
      closefile(f1);
      //showmessage('连接失败...');
      result := false;
      F_WEB_UPDATE.Memo1.lines.add(F_WEB_UPDATE.serfilename + '服务器连接失败,取消下载' + #13#10);
   end;
end;

procedure TF_WEB_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;
         for i := 0 to files.Count - 1 do //从update复制新文件
            begin
               copyfile(pchar(g_path + 'update\' + files[i]), pchar(g_path + files[i]), false);
               DeleteFile(pchar(g_path + 'update\' + files[i])); //删除update目录中的升级文件
            end;
         try
            AppIni := TIniFile.Create(g_path + 'chis.ini');
            run_exe := AppIni.ReadString('chis', 'exe', '');
            if run_exe <> '' then shellexecute(handle, 'open', pchar(run_exe), nil, nil, sw_show);
         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 TF_WEB_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 TF_WEB_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 TF_WEB_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 + '\chis.ini');
               Edt_url.Text := AppIni.ReadString('update', ListBox_servers.Items[i], 'http://');
            finally
               AppIni.Free;
            end;
         end;
end;

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

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

function TF_WEB_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);
      {for i := 0 to files.Count - 1 do   //逐个文件进行判断是否需要更新
      try
        iFileHandle := FileOpen(g_path + files[i], fmOpenRead);
        FileDateTime := FileDateToDateTime(FileGetDate(iFileHandle));
        FileClose(iFileHandle);
        listview_files.Items[i].SubItems.Add(appini.ReadString(files[i], 'datetime', ''));
        if FileDateTime < strtodatetime(Appini.ReadString(files[i], 'datetime', '')) then
        begin
          result := true;
           break;
        listview_files.Items[i].SubItems.Add('是')
        else
        listview_files.Items[i].SubItems.Add('否');
          end;
      except
      end;}
   finally
      AppIni.Free;
   end;
   result := true;
end;

procedure TF_WEB_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 TF_WEB_UPDATE.Button1Click(Sender: TObject);
begin
   if self.Height = 280 then
      self.Height := 438
   else
      self.Height := 280;
end;

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

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

end.

⌨️ 快捷键说明

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