自动升级系统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<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(可直接部署)

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

时间: 2024-10-05 05:02:06

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

自动升级系统的设计与实现(续2) -- 增加断点续传功能 (附最新源码)

一.缘起 之前已经写了两篇关于自动升级系统OAUS的设计与实现的文章(第一篇.第二篇),在为OAUS服务端增加自动检测文件变更的功能(这样每次部署版本升级时,可以节省很多时间,而且可以避免手动修改带来的错误)后,有部分使用者又提出了一个很好的建议:为OAUS增加断点续传功能.因为如果网络状态不是很好,就经常会在升级到一半的时候,由于OAUS客户端掉线而导致升级失败,这个时候,就必须重新开始整个升级过程.即使升级中断的时候,已经完成了99%,也必须重头再来.所以,为OAUS增加断点续传功能是非常必

生产环境监控系统Nginx+Nagios+Cacti+Nconf大整合(最新源码安装)【转载】

在此部署方案基础上可以加入对网络设备监控的组件NTOP,原Cacti运行环境标配的组件为Apache,另针对windows系统的监控插件为NSClient++ 文章转载自:https://blog.linuxeye.com/314.html 此文是成功在<Nginx下搭建Nagios监控平台>基础上继续,安装整合Cacti.Nconf.其中花了很多时间来排错.1.下载所需要最新稳定源码包 cd nagios-cacti wget http://www.cacti.net/downloads/c

自动升级系统的设计与实现(源码)

对于PC桌面应用程序而言,自动升级功能往往是必不可少的.而自动升级可以作为一个独立的C/S系统来开发,这样,就可以在不同的桌面应用中进行复用.基于ESFramework的文件传送功能,我实现了一个可直接复用的自动升级系统OAUS,现在将其分享给大家.这篇文章将着重介绍OAUS的相关背景.使用方法,至于详细的实现细节,大家可以直接下载源码研究.如果了解了OAUS的使用,源码的理解就非常容易了.如果需要直接部署使用自动升级系统,那么,可下载文末的可执行程序压缩包. 一.OAUS的主要功能 目前主流的

CSDN开源夏令营 基于Compiz的switcher插件设计与实现之编译compiz源码

在开始介绍之前先吐个嘈:上周我们暑期ACM集训开始了,平均下来基本上是一天一赛,有时还不止,又是多校联赛,又是CodeForces,又是TopCoder,又是BestCoder,又是AcDream,还有学校自己组织的个人赛,组队赛,感觉累成狗了,上周好多时间都用来比赛和训练了,项目这边花的时间就有点少了,感觉挺对不起老师的,唉-. 之前一直在为项目的实现做一些准备工作(搭建各种环境,熟悉各种操作什么的),现在感觉准备工作做的差不多了,差不多要进入开发阶段了.由于我之前没有接触过开发插件这样的项目

.Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还需要掌握identity server4的基本用法,关于identity server4因为设计到两个协议Oath2.0和openid connect协议,内容较多,不是本文重点,后续有时间我会写一片关于identity server4的源码分析.且为了保证整个系统的高度可控,我重写了整个id4,留

最新六合彩投注网站系统出租,网站建设,开发,及源码(可商业运行)

这是最新六合彩投注网站系统建设,开发,及源码(可商业运行),六合彩系统 带新开奖结果>>>>>玩法齐全,各类玩法内附说明.数据库文件  hs001   修改数据库连接  文件夹 configs  文件config后台管理 admin admin前台会员目录 member <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore_js_op>

linux系统下进入tomcat的管理界面与ssc源码下载

1.添加用户和权限(<tomcat>\conf\tomcat-users.xml):ssc源码下载(企 娥:217 1793 408) <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="admin" password="admin" roles="admin-gui,mana

winform 自动升级

自动升级系统OAUS的设计与实现(续) (附最新源码) http://www.cnblogs.com/zhuweisky/p/4209058.html

自己主动升级系统的设计与实现(续2) -- 添加断点续传功能 (附最新源代码)

一.缘起 之前已经写了两篇关于自己主动升级系统OAUS的设计与实现的文章(第一篇.第二篇).在为OAUS服务端添加自己主动检測文件变更的功能(这样每次部署版本号升级时,能够节省非常多时间.并且能够避免手动改动带来的错误)后,有部分使用者又提出了一个非常好的建议:为OAUS添加断点续传功能.由于假设网络状态不是非常好,就常常会在升级到一半的时候,由于OAUSclient掉线而导致升级失败,这个时候,就必须又一次開始整个升级过程. 即使升级中断的时候.已经完毕了99%,也必须重头再来.所以,为OAU