自动升级系统OAUS的设计与实现断点续传(附最新源码)
自动升级系统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); ......//退出当前进程 }
客户端运行后,升级过程截图如下:
三.相关下载
如果有任何建议或问题,请留言给我。
敬请了解:
ESFramework通信框架 OMCS网络语音视频框架 MFile语音视频录制组件 MCapture语音视频采集组件 StriveEngine轻量级通信引擎 OAUS 自动升级系统
2025-06-20 11:13:10【出处】:https://www.cnblogs.com/zhuweisky/p/4209058.html
=======================================================================================
自动升级系统的设计与实现(续2) -- 增加断点续传功能 (附最新源码)
一.缘起
之前已经写了两篇关于自动升级系统OAUS的设计与实现的文章(第一篇、第二篇),在为OAUS服务端增加自动检测文件变更的功能(这样每次部署版本升级时,可以节省很多时间,而且可以避免手动修改带来的错误)后,有部分使用者又提出了一个很好的建议:为OAUS增加断点续传功能。因为如果网络状态不是很好,就经常会在升级到一半的时候,由于OAUS客户端掉线而导致升级失败,这个时候,就必须重新开始整个升级过程。即使升级中断的时候,已经完成了99%,也必须重头再来。所以,为OAUS增加断点续传功能是非常必要的。
现在,最新版本的OAUS已经增加了这个重要特性,当升级因为掉线而中断的时候,OAUS客户端并不会退出,而是一直尝试断线重连,重连成功后,就会从上次中断的地方继续升级。如下图所示:
在网络状态极差时,可能在一次升级的过程中,会出现多次断线重连的情况,这都没关系,OAUS客户端会一直正常工作,直到整个升级过程完成为止。
二.源码实现
下面简单说明一下代码实现的具体过程,OAUS断点续传功能是在客户端实现的,服务端不需要做任何修改。
1.预定网络连接断开的事件,得到掉线通知。此时,需要记录是在升级第几个文件的时候,升级中断的。
2.预定重连成功时间,得到网络链接恢复的通知。此时,开始重新下载下一个需要升级的文件。
void rapidPassiveEngine_RelogonCompleted(LogonResponse res) { if (res.LogonResult == LogonResult.Succeed) { this.DownloadNextFile(); this.logger.LogWithTime("重连成功,开始续传!"); if (this.UpdateContinued != null) { this.UpdateContinued(); } return; } }
private void DownloadNextFile() { if (this.haveUpgradeCount >= this.fileCount) { return; } DownloadFileContract downLoadFileContract = new DownloadFileContract(); downLoadFileContract.FileName = this.downLoadFileRelativeList[this.haveUpgradeCount]; //请求下载下一个文件 this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize(downLoadFileContract)); }
加上以上的逻辑处理之后,OAUS就已经具备了断点续传的功能了。代码看起来非常简单,那是因为内部核心的文件传送功能、断点续传功能都由ESFramework封装好了。在为OAUS增加断点续传功能时,就不需要再次实现与断点续传相关的繁琐的业务逻辑了。
3. 如何使用OAUS升级机制的说明
一般而言,如果最新客户端程序与老版本兼容,不升级也影响不大,则可以交由用户决定是否升级;如果最新客户端程序不兼容老版本,或者是有重大更新,则将启动强制升级。如果流程要进入启动升级,那么只要启动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); ......//退出当前进程 }
三.相关下载
如果有任何建议或问题,请留言给我。
2025-06-20 11:10:51【出处】:https://www.cnblogs.com/zhuweisky/p/5085099.html
=======================================================================================
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/18938009
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!