自动升级系统OAUS的设计与实现(续) (附最新源码)

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

  (最新OAUS版本请参见:自动升级系统的设计与实现(续2) -- 增加断点续传功能

一.缘起    

  自从 自动升级系统的设计与实现(源码) 发布以后,收到了很多使用者的反馈,其中最多的要求就是希望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(可直接部署) 

3.自动升级系统OAUS - 使用手册

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

 

目录
相关文章
|
18天前
|
运维 数据库管理 Python
部署spug二次开发环境时常见的故障解决方案
这篇文章介绍了部署spug二次开发环境时可能遇到的常见问题及其解决方案,包括环境准备、故障处理和相关配置。
38 8
|
2月前
|
缓存 小程序
【微信小程序-原生开发】启动时自动升级更新到最新版本
【微信小程序-原生开发】启动时自动升级更新到最新版本
38 0
|
2月前
|
监控 测试技术 UED
升级和维护老旧LabVIEW程序
升级和维护老旧LabVIEW程序
34 0
交易所开发稳定版丨交易所系统开发指南步骤/方案逻辑/详细功能/需求设计/源码说明
The development of a digital currency exchange system refers to the design, construction, and implementation of an online platform for trading and managing digital currencies (such as Bitcoin, Ethereum, etc.). The system provides an infrastructure for digital asset trading,
|
存储 安全 数据安全/隐私保护
|
安全 数据安全/隐私保护
定制开发混币器软件需要注意事项
定制开发混币器软件需要注意事项
|
监控 安全 UED
CleanMyMac X4.11新版本上线及功能介绍
本次新功能上线后,CleanMyMac X 除了管理内存以及应用程序等基础功能之外,新增了可以实时监控 Mac 所有关键区域状态的功能。
137 0
CleanMyMac X4.11新版本上线及功能介绍
|
运维 Kubernetes Cloud Native
Rainbond 5.6 版本发布,增加多种安装方式,优化拓扑图操作体验
Rainbond 5.6 版本,主要致力于提升拓扑图操作效率以及快速安装体验,降低用户使用门槛。
Rainbond 5.6 版本发布,增加多种安装方式,优化拓扑图操作体验
|
Oracle Java 关系型数据库
一劳永逸的安装JDK,支持快速的版本切换
登录oracle下载对应JDK https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html (链接以后可能失效) 下载 jdk-8u291-linux-x64.tar.gz 安装java
227 0
一劳永逸的安装JDK,支持快速的版本切换