自动升级系统OAUS续

2024-09-07 15:08
文章标签 系统 自动 升级 oaus

本文主要是介绍自动升级系统OAUS续,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.缘起    

  自从 自动升级系统的设计与实现(源码) 发布以后,收到了很多使用者的反馈,其中最多的要求就是希望OAUS服务端增加自动检测文件变更的功能,这样每次部署版本升级时,可以节省很多时间,而且可以避免手动修改带来的错误。

  现在,我就简单介绍一下最新版本的OAUS中关于这个功能的实现。在上一个版本中,我们是这样操作的: 

      

  每次有版本更新时,我们需要把更新的文件拷贝到服务端的FileFolder文件夹下覆盖掉旧的文件,然后通过上述的操作界面,来手动修改每个文件的版本号。这个过程很繁琐,而且容易出错。于是,新版本就增加了自动扫描的功能,一键就可以搞定。

  新版的操作界面截图如下所示:

  

  点击“自动扫描”按钮,服务端就会检索FileFolder文件夹下文件的名称、大小、最后更新时间,然后得出本次更新结果:变化了几个文件、新增了几个文件、删除了几个文件。

二.源码实现

  下面简单说明一下代码实现的具体过程。

1.FileUnit类增加 FileSize 和 LastUpdateTime 属性:这两个属性用于作为比对文件是否发生变化的最根本依据。

2.具体实现代码如下:

复制代码
    private void button1_Click(object sender, EventArgs e){int changedCount = 0;int addedCount = 0;List<FileUnit> deleted = new List<FileUnit>();List<string> files = ESBasic.Helpers.FileHelper.GetOffspringFiles(AppDomain.CurrentDomain.BaseDirectory + "FileFolder\\");//第一轮:检测发生变化和新增的文件foreach (string fileRelativePath in files){FileInfo info = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "FileFolder\\" + fileRelativePath);FileUnit unit = this.GetFileUnit(fileRelativePath);if (unit == null) //新增的文件
            {unit = new FileUnit(fileRelativePath, 1, (int)info.Length, info.LastWriteTime);this.fileConfig.FileList.Add(unit);++addedCount;}else{//发生变化的文件if (unit.FileSize != info.Length || unit.LastUpdateTime.ToString() != info.LastWriteTime.ToString()){unit.Version += 1;unit.FileSize = (int)info.Length;unit.LastUpdateTime = info.LastWriteTime;++changedCount;}}}//第二轮:检测被删除的文件foreach (FileUnit unit in this.fileConfig.FileList){bool found = false;foreach (string fileRelativePath in files){if (fileRelativePath == unit.FileRelativePath){found = true;break;}}if (!found){deleted.Add(unit);}}foreach (FileUnit unit in deleted){this.fileConfig.FileList.Remove(unit);}this.fileConfig.Save();if (changedCount > 0 || addedCount > 0 || deleted.Count > 0){this.changed = true;this.dataGridView1.DataSource = null;this.dataGridView1.DataSource = this.fileConfig.FileList;string msg = string.Format("更新:{0},新增:{1},删除:{2}", changedCount, addedCount, deleted.Count);MessageBox.Show(msg);}else{MessageBox.Show("没有检测到变化。");}           }
复制代码

(1)首先,第一轮检测发生变化的或新增的文件。

(2)然后,第二轮检测被删除的文件。

(3)每次检测完毕后,都更新维护的版本号。

  最后,我保留了原始的手动更新版本号的功能,以备不时之需。

3. 关于客户端如何使用升级机制的说明

  一般而言,如果最新客户端程序与老版本兼容,不升级也影响不大,则可以交由用户决定是否升级;如果最新客户端程序不兼容老版本,或者是有重大更新,则将启动强制升级。如果流程要进入启动升级,那么只要启动AutoUpdater的文件夹下AutoUpdater.exe就可以了。要注意的是,启动AutoUpdater.exe进程后,要退出当前的客户端进程,否则,有些文件会因为无法被覆盖而导致更新失败。代码大致如下所示: 

  if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) {      string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe";   System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath);     ......//退出当前进程  } 

  客户端运行后,升级过程截图如下:

      

三.相关下载

1.自动升级系统OAUS - 源码

2.自动升级系统OAUS(可直接部署)

  如果有任何建议或问题,请留言给我。

这篇关于自动升级系统OAUS续的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145394

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默