实例介绍
【实例简介】
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.Text;
using ESBasic;
using OAUS.Core;
using ESPlus.Rapid;
using ESPlus.Serialization;
using ESPlus.FileTransceiver;
using System.IO;
using ESBasic.Loggers;
using ESPlus.Application.Basic;
using System.Threading;
namespace AutoUpdater
{
public class Updater
{
private bool stoped = false;
private FileAgileLogger logger = new FileAgileLogger(AppDomain.CurrentDomain.BaseDirectory "UpdateLog.txt");
private IRapidPassiveEngine rapidPassiveEngine;
private UpdateConfiguration updateConfiguration = new UpdateConfiguration();
private int fileCount = 0; //要升级的文件个数。
private int haveUpgradeCount = 0; //已经升级的文件个数。
private IList<FileUnit> removedFileList; //将被删除的文件个数。
private IList<string> downLoadFileRelativeList; //需要升级的所有文件的相对路径 的列表。
private string appDirPath;
public event CbGeneric<int> ToBeUpdatedFilesCount;
public event CbGeneric UpdateStarted;
public event CbGeneric<int, string, ulong> FileToBeUpdated;
public event CbGeneric<ulong, ulong> CurrentFileUpdatingProgress;
public event CbGeneric<string> UpdateDisruptted;
public event CbGeneric UpdateCompleted;
public event CbGeneric ConnectionInterrupted;
/// <summary>
/// 重连成功后,开始续传。
/// </summary>
public event CbGeneric UpdateContinued;
public Updater(string serverIP, int serverPort)
{
this.UpdateStarted = new CbGeneric(Updater_UpdateStarted);
this.UpdateDisruptted = new CbGeneric<string>(Updater_UpdateDisruptted);
this.UpdateCompleted = new CbGeneric(Updater_UpdateCompleted);
DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
this.appDirPath = dir.Parent.FullName "\\";
this.rapidPassiveEngine = RapidEngineFactory.CreatePassiveEngine();
this.rapidPassiveEngine.AutoReconnect = true;
Random random = new Random();
//初始化引擎并登录,返回登录结果
bool canLogon = false;
for (int i = 0; i < 100; i )
{
string userid = random.Next(1000000).ToString("00000");
LogonResponse logonResponse = rapidPassiveEngine.Initialize(userid, "", serverIP, serverPort, null);
if (logonResponse.LogonResult == LogonResult.Succeed)
{
canLogon = true;
break;
}
}
if (!canLogon)
{
throw new Exception("Failed to connect OAUS server !");
}
this.rapidPassiveEngine.ConnectionInterrupted = new CbGeneric(rapidPassiveEngine_ConnectionInterrupted);
this.rapidPassiveEngine.RelogonCompleted = new CbGeneric<LogonResponse>(rapidPassiveEngine_RelogonCompleted);
}
void rapidPassiveEngine_RelogonCompleted(LogonResponse res)
{
if (res.LogonResult == LogonResult.Succeed)
{
this.DownloadNextFile();
this.logger.LogWithTime("重连成功,开始续传!");
if (this.UpdateContinued != null)
{
this.UpdateContinued();
}
return;
}
this.logger.LogWithTime("重连失败!");
if (this.UpdateDisruptted != null)
{
this.UpdateDisruptted(FileTransDisrupttedType.SelfOffline.ToString());
}
}
void rapidPassiveEngine_ConnectionInterrupted()
{
if (this.ConnectionInterrupted != null)
{
this.ConnectionInterrupted();
}
this.logger.LogWithTime("连接断开,正在重连!");
}
void Updater_UpdateCompleted()
{
this.logger.LogWithTime("Update completed!");
}
void Updater_UpdateDisruptted(string fileTransDisrupttedType)
{
this.logger.LogWithTime(string.Format("Update Failed!Cause:{0}。", fileTransDisrupttedType));
}
void Updater_UpdateStarted()
{
this.logger.LogWithTime(string.Format("Update starting. There is {0} files to be updated ......", this.fileCount));
}
public void Start()
{
//配置文件中记录着各个文件的版本信息。
if (!File.Exists(UpdateConfiguration.ConfigurationPath))
{
this.updateConfiguration.Save();
}
else
{
this.updateConfiguration = (UpdateConfiguration)UpdateConfiguration.Load(UpdateConfiguration.ConfigurationPath);
}
//启动升级线程
CbGeneric cb2 = new CbGeneric(this.UdpateThread);
cb2.BeginInvoke(null, null);
}
private void UdpateThread()
{
try
{
this.GetUpdateInfo(out this.downLoadFileRelativeList, out this.removedFileList);
this.fileCount = this.downLoadFileRelativeList.Count;
if (this.ToBeUpdatedFilesCount != null)
{
this.ToBeUpdatedFilesCount(this.fileCount);
}
if (this.fileCount == 0 && this.removedFileList.Count == 0)
{
return;
}
if (this.UpdateStarted != null)
{
this.UpdateStarted();
}
this.rapidPassiveEngine.FileOutter.FileRequestReceived = new ESPlus.Application.FileTransfering.CbFileRequestReceived(fileOutter_FileRequestReceived);
this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransStarted = new CbGeneric<TransferingProject>(FileReceivingEvents_FileTransStarted);
this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransCompleted = new ESBasic.CbGeneric<TransferingProject>(FileReceivingEvents_FileTransCompleted);
this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransDisruptted = new CbGeneric<TransferingProject, FileTransDisrupttedType>(FileReceivingEvents_FileTransDisruptted);
this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransProgress = new CbFileSendedProgress(FileReceivingEvents_FileTransProgress);
if (downLoadFileRelativeList.Count > 0)
{
DownloadFileContract downLoadFileContract = new DownloadFileContract();
downLoadFileContract.FileName = this.downLoadFileRelativeList[0];
//请求下载第一个文件
this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize<DownloadFileContract>(downLoadFileContract));
}
else
{
//仅仅只有删除文件
if (this.removedFileList.Count > 0)
{
foreach (FileUnit file in this.removedFileList)
{
ESBasic.Helpers.FileHelper.DeleteFile(this.appDirPath file.FileRelativePath);
}
this.updateConfiguration.Save();
if (this.UpdateCompleted != null)
{
this.UpdateCompleted();
}
}
}
}
catch (Exception ee)
{
this.logger.Log(ee, "AutoUpdater.Updater.UdpateThread", ErrorLevel.High);
if (this.UpdateDisruptted != null)
{
this.UpdateDisruptted(FileTransDisrupttedType.InnerError.ToString());
}
}
}
/// <summary>
/// 与服务器的最新版本进行比较,获取要升级的所有文件信息。
/// </summary>
private void GetUpdateInfo(out IList<string> downLoadFileNameList, out IList<FileUnit> removeFileNameList)
{
byte[] lastUpdateTime = rapidPassiveEngine.CustomizeOutter.Query(InformationTypes.GetLastUpdateTime, null);
LastUpdateTimeContract lastUpdateTimeContract = CompactPropertySerializer.Default.Deserialize<LastUpdateTimeContract>(lastUpdateTime, 0);
downLoadFileNameList = new List<string>();
removeFileNameList = new List<FileUnit>();
if (this.updateConfiguration.ClientVersion != lastUpdateTimeContract.ClientVersion)
{
//获取文件版本信息列表
byte[] fileInfoBytes = rapidPassiveEngine.CustomizeOutter.Query(InformationTypes.GetAllFilesInfo, null);
FilesInfoContract contract = CompactPropertySerializer.Default.Deserialize<FilesInfoContract>(fileInfoBytes, 0);
foreach (FileUnit file in this.updateConfiguration.FileList)
{
FileUnit fileAtServer = ContainsFile(file.FileRelativePath, contract.AllFileInfoList);
if (fileAtServer != null)
{
if (file.Version < fileAtServer.Version)
{
downLoadFileNameList.Add(file.FileRelativePath);
}
}
else
{
removeFileNameList.Add(file);
}
}
foreach (FileUnit file in contract.AllFileInfoList)
{
FileUnit fileAtServer = ContainsFile(file.FileRelativePath, this.updateConfiguration.FileList);
if (fileAtServer == null)
{
downLoadFileNameList.Add(file.FileRelativePath);
}
}
this.updateConfiguration.FileList = contract.AllFileInfoList;
this.updateConfiguration.ClientVersion = lastUpdateTimeContract.ClientVersion;
}
}
private FileUnit ContainsFile(string fileName, IList<FileUnit> fileObjects)
{
foreach (FileUnit file in fileObjects)
{
if (file.FileRelativePath == fileName)
{
return file;
}
}
return null;
}
//服务端要发送某个新版本的文件给客户端时,准备开始接收文件。
void fileOutter_FileRequestReceived(string projectID, string senderID, string fileName, ulong totalSize, ResumedProjectItem resumedFileItem, string comment)
{
string relativePath = comment;
string localSavePath = AppDomain.CurrentDomain.BaseDirectory "temp\\" relativePath;
this.EnsureDirectoryExist(localSavePath);
//准备开始接收文件
this.rapidPassiveEngine.FileOutter.BeginReceiveFile(projectID, localSavePath,true);
}
void FileReceivingEvents_FileTransStarted(TransferingProject transferingProject)
{
if (this.FileToBeUpdated != null)
{
this.FileToBeUpdated(this.haveUpgradeCount, transferingProject.ProjectName, transferingProject.TotalSize);
}
}
void FileReceivingEvents_FileTransProgress(string fileID, ulong total, ulong transfered)
{
if (this.CurrentFileUpdatingProgress != null)
{
this.CurrentFileUpdatingProgress(total, transfered);
}
}
#region FileReceivingEvents_FileTransDisruptted
void FileReceivingEvents_FileTransDisruptted(TransferingProject transmittingFileInfo, FileTransDisrupttedType fileTransDisrupttedType)
{
if (fileTransDisrupttedType == FileTransDisrupttedType.SelfOffline)
{
return;
}
//删除已经更新的文件
string sourcePath = AppDomain.CurrentDomain.BaseDirectory "temp\\";
ESBasic.Helpers.FileHelper.DeleteDirectory(sourcePath);
if (this.UpdateDisruptted != null)
{
this.UpdateDisruptted(fileTransDisrupttedType.ToString());
}
}
#endregion
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>(downLoadFileContract));
}
#region FileReceivingEvents_FileTransCompleted
void FileReceivingEvents_FileTransCompleted(TransferingProject obj)
{
try
{
this.haveUpgradeCount ;
if (this.haveUpgradeCount < this.fileCount)
{
this.DownloadNextFile();
}
else //所有文件都升级完毕
{
//copy文件,删除temp文件夹
string sourcePath = AppDomain.CurrentDomain.BaseDirectory "temp\\";
foreach (string fileRelativePath in this.downLoadFileRelativeList)
{
string sourceFile = sourcePath fileRelativePath;
string destFile = this.appDirPath "\\" fileRelativePath;
this.EnsureDirectoryExist(destFile);
File.Copy(sourceFile, destFile, true);
}
ESBasic.Helpers.FileHelper.DeleteDirectory(sourcePath);
//删除多余的文件
foreach (FileUnit file in this.removedFileList)
{
ESBasic.Helpers.FileHelper.DeleteFile(this.appDirPath file.FileRelativePath);
}
this.updateConfiguration.Save();
if (this.UpdateCompleted != null)
{
this.UpdateCompleted();
}
}
}
catch (Exception ee)
{
this.logger.Log(ee, "AutoUpdater.Updater.UdpateThread", ErrorLevel.High);
if (this.UpdateDisruptted != null)
{
this.UpdateDisruptted(FileTransDisrupttedType.InnerError.ToString());
}
}
}
#endregion
private void EnsureDirectoryExist(string filePath)
{
int index = filePath.LastIndexOf("\\");
string dir = filePath.Substring(0, index 1);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)