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

一.缘起    

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

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

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

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

  

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

二.源码实现

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

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

2.具体实现代码如下:

    private void button1_Click(object sender, EventArgs e)
{
int changedCount = ;
int addedCount = ;
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, , (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 += ;
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 > || addedCount > || deleted.Count > )
{
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 - 使用手册

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

敬请了解:

ESFramework通信框架     OMCS网络语音视频框架     MFile语音视频录制组件    MCapture语音视频采集组件  StriveEngine轻量级通信引擎    OAUS 自动升级系统

最新文章

  1. 为 Docker Registry 增加 Nginx 前端
  2. 如何实现 Android 应用的持续部署?
  3. SQL Server数据库(SQL Sever语言 事务)
  4. Linux驱动设计——字符设备驱动(一)
  5. BestCoder Round #86 部分题解
  6. 浅析JVM内存结构和6大区域(转)
  7. Altium Designer完美双屏显示方法演示
  8. KTV点歌系统播放原理
  9. 哈希集合——hashSet
  10. poj 2184 Cow Exhibition(dp之01背包变形)
  11. easyui+ajax获取同表关联的数据
  12. NOIP2014-5-10模拟赛
  13. python--sort()和sorted()高级排序
  14. java单例模式实例
  15. 【LOJ】#2205. 「HNOI2014」画框
  16. PHP视频教程 字符串处理函数(三)
  17. 【bzoj1115】[POI2009]石子游戏Kam(博弈论)
  18. mac之homebrew安装
  19. (未解决)WIN8下使用POWERSHELL安装python easy_install无法成功
  20. curl使用说明

热门文章

  1. js分秒必争
  2. 调用 WebService 浏览器提示 500 (Internal Server Error) 的原因及解决办法
  3. exe文件放在其他位置
  4. 项目jar包管理,使用 .userlibraries 文件增加jar包的可移植性,明确jar包依赖,多项目共用jar包里
  5. vsftp linux
  6. sublime配置react
  7. Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)
  8. GCC4.8.2升级安装
  9. 在SqlServer查询分析器里 访问远程数据库 进行数据查询更新等操作(openrowset)
  10. Spring控制反转(IOC)和依赖注入(DI),再记不住就去出家!