(最新OAUS版本请参见:自动升级系统的设计与实现(续2) -- 增长断点续传功能)html
自从 自动升级系统的设计与实现(源码) 发布之后,收到了不少使用者的反馈,其中最多的要求就是但愿OAUS服务端增长自动检测文件变动的功能,这样每次部署版本升级时,能够节省不少时间,并且能够避免手动修改带来的错误。spring
如今,我就简单介绍一下最新版本的OAUS中关于这个功能的实现。在上一个版本中,咱们是这样操做的: 网络
每次有版本更新时,咱们须要把更新的文件拷贝到服务端的FileFolder文件夹下覆盖掉旧的文件,而后经过上述的操做界面,来手动修改每一个文件的版本号。这个过程很繁琐,并且容易出错。因而,新版本就增长了自动扫描的功能,一键就能够搞定。框架
新版的操做界面截图以下所示:this
点击“自动扫描”按钮,服务端就会检索FileFolder文件夹下文件的名称、大小、最后更新时间,而后得出本次更新结果:变化了几个文件、新增了几个文件、删除了几个文件。spa
下面简单说明一下代码实现的具体过程。设计
1.FileUnit类增长 FileSize 和 LastUpdateTime 属性:这两个属性用于做为比对文件是否发生变化的最根本依据。code
2.具体实现代码以下:orm
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); ......//退出当前进程 }
客户端运行后,升级过程截图以下:
若是有任何建议或问题,请留言给我。
敬请了解:
ESFramework通讯框架 OMCS网络语音视频框架 MFile语音视频录制组件 MCapture语音视频采集组件 StriveEngine轻量级通讯引擎 OAUS 自动升级系统