C#如何实现自动更新本地程序的实例分析
导读:收集整理的这篇文章主要介绍了C#如何实现自动更新本地程序的实例分析,觉得挺不错的,现在分享给大家,也给大家做个参考。关于系统的自动更新。近日有一情况是需要将java端后台最新版本的系统文件覆盖本地客户端,简称自动更新了。本地会获取当前系统的...
收集整理的这篇文章主要介绍了C#如何实现自动更新本地程序的实例分析,觉得挺不错的,现在分享给大家,也给大家做个参考。关于系统的自动更新。近日有一情况是需要将java端后台最新版本的系统文件覆盖本地客户端,简称自动更新了。本地会获取当前系统的版本号去请求后台java的接口数据。返回给我的是后台压缩包转的base64字节流。
客户端拿到新版本需要更新本地程序。
if (UpdateSystem(Path.COMbine(Application.StartupPath, "Version.txt"), Path.Combine(Application.StartupPath, "u.zip"))) {
Application.ExIT();
}
/// summary>
/// 读取本地版本请求更新 /// /summary>
/// param name="document">
读取的文件信息/param>
/// param name="zipPath">
返回zip包本地路径/param>
/// returns>
/returns>
PRivate bool UpdateSystem(string document, string zipPath) {
try {
Dictionarystring, string>
postDic = new Dictionarystring, string>
();
//获取文件内的版本号 if(File.Exists(document)) {
postDic.Add("version", File.ReadAllText(document).Trim());
}
else {
postDic.Add("version", "0");
}
string postJSON = JsonConvert.SerializeObject(postDic);
string url = GetAppSettingValue("serverUrl") + "parkClient/parkClientUpdate";
//返回的json数据 JObject obj = (JObject)JsonConvert.DeserializeObject(PostData(postJson, url));
string newVersion = obj["version"].ToString();
if (!String.IsNullOrWhiteSpace(newVersion)) {
byte[] bytesFile = Convert.FromBase64String(obj["byteArray"].ToString());
if (obj["clientMD5"].ToString() == BitConverter.ToString( new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(bytesFile)).Replace("-", "")) {
ZipCoverage(bytesFile, zipPath);
File.WriteAllText(document, newVersion);
}
}
return true;
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
return false;
}
}
/// summary>
/// 解压zip包覆盖更新 /// /summary>
/// param name="bytes">
接受更新包的字节信息/param>
/// param name="zpath">
覆盖的路径/param>
private void ZipCoverage(byte[] bytes, string zpath) {
File.WriteAllBytes(zpath, bytes);
using (ZipArchive archive = ZipFile.OPEnRead(zpath)) {
string file = null;
foreach (ZipArchiveEntry entry in archive.Entries) {
if (!entry.FullName.EndsWith("/")) {
file = Path.Combine(Application.StartupPath, entry.FullName);
if (File.Exists(file)) {
File.Delete(file);
}
}
}
}
ZipFile.ExtractToDirectory(zpath, Application.StartupPath);
}
/// summary>
/// 获取配置文件中的appSettings节中的配置内容 /// /summary>
/// param name="appSettingKey">
/param>
/// param name="message">
/param>
/// returns>
/returns>
private string GetAppSettingValue(string appSettingKey) {
ExeconfigurationFileMap map = new ExeConfigurationFileMap {
ExeConfigFilename = @"TDH.Parking.Client.exe.config" }
;
return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).AppSettings.Settings[appSettingKey].Value;
}
byte[] bytesFile = Convert.FromBase64String(obj["byteArray"].ToString());
这里是拿到的字节流了。
这个方法可以解决在同一个解决方案中有多个项目可以读取到同一个项目下的App.config文件。
注意:其中有引用到的类库, 这是是用来操作压缩包的。
说下思路:第一步其实就是拿到压缩包的字节流再保存到本地,第二步就是循环读取压缩包的文件替换本地的文件,完成本地系统的版本更新。
无论简单与复杂,都需一步步向前方迈进。
以上就是C#如何实现自动更新本地程序的实例分析的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C#如何实现自动更新本地程序的实例分析
本文地址: https://pptw.com/jishu/592740.html
