zoukankan      html  css  js  c++  java
  • 自动升级系统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 - 使用手册

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

    敬请了解:

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

  • 相关阅读:
    使用Windows Live Writer发布日志
    下雪
    Oracle中拼出树型结构
    [转载]Javascript中最常用的55个经典技巧
    博客访问者来自15个国家和地区
    [转载]一个帐号同一时间只能一个人登录
    换了博客的皮肤
    常见的开源软件许可
    java5中的Arrays
    青花瓷
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/4209058.html
Copyright © 2011-2022 走看看