博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动升级系统OAUS的设计与实现(续) (附最新源码)
阅读量:5820 次
发布时间:2019-06-18

本文共 3475 字,大约阅读时间需要 11 分钟。

  (最新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
deleted = new List
(); List
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.

2. 

3.

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

 

转载地址:http://nmzdx.baihongyu.com/

你可能感兴趣的文章
锐捷交换机密码恢复(1)
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
My97DatePicker 日历插件
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>