关于系统的自动更新。近日有一情况是需要将java端后台最新版本的系统文件覆盖本地客户端,简称自动更新了。

本地会获取当前系统的版本号去请求后台java的接口数据。返回给我的是后台压缩包转的base64字节流。

客户端拿到新版本需要更新本地程序。

  1.    if (UpdateSystem(Path.Combine(Application.StartupPath, "Version.txt"), Path.Combine(Application.StartupPath, "u.zip")))
  2. {
  3. Application.Exit();
  4. }
  1.      /// <summary>
  2. /// 读取本地版本请求更新
  3. /// </summary>
  4. /// <param name="document">读取的文件信息</param>
  5. /// <param name="zipPath">返回zip包本地路径</param>
  6. /// <returns></returns>
  7. private bool UpdateSystem(string document, string zipPath)
  8. {
  9. try
  10. {
  11. Dictionary<string, string> postDic = new Dictionary<string, string>();
  12. //获取文件内的版本号
  13. if(File.Exists(document))
  14. {
  15. postDic.Add("version", File.ReadAllText(document).Trim());
  16. }
  17. else
  18. {
  19. postDic.Add("version", "");
  20. }
  21.  
  22. string postJson = JsonConvert.SerializeObject(postDic);
  23. string url = GetAppSettingValue("serverUrl") + "parkClient/parkClientUpdate";
  24. //返回的json数据
  25. JObject obj = (JObject)JsonConvert.DeserializeObject(PostData(postJson, url));
  26. string newVersion = obj["version"].ToString();
  27. if (!String.IsNullOrWhiteSpace(newVersion))
  28. {
  29. byte[] bytesFile = Convert.FromBase64String(obj["byteArray"].ToString());
  30. if (obj["clientMD5"].ToString() == BitConverter.ToString(
  31. new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(bytesFile)).Replace("-", ""))
  32. {
  33. ZipCoverage(bytesFile, zipPath);
  34.  
  35. File.WriteAllText(document, newVersion);
  36.  
  37. }
  38. }
  39.  
  40. return true;
  41. }
  42. catch (Exception ex)
  43. {
  44. MessageBox.Show(ex.Message);
  45. return false;
  46. }
  47. }
  48.  
  49. /// <summary>
  50. /// 解压zip包覆盖更新
  51. /// </summary>
  52. /// <param name="bytes">接受更新包的字节信息</param>
  53. /// <param name="zpath">覆盖的路径</param>
  54. private void ZipCoverage(byte[] bytes, string zpath)
  55. {
  56. File.WriteAllBytes(zpath, bytes);
  57. using (ZipArchive archive = ZipFile.OpenRead(zpath))
  58. {
  59. string file = null;
  60. foreach (ZipArchiveEntry entry in archive.Entries)
  61. {
  62. if (!entry.FullName.EndsWith("/"))
  63. {
  64. file = Path.Combine(Application.StartupPath, entry.FullName);
  65. if (File.Exists(file))
  66. {
  67. File.Delete(file);
  68. }
  69. }
  70. }
  71. }
  72. ZipFile.ExtractToDirectory(zpath, Application.StartupPath);
  73.  
  74. }
  75.  
  76. /// <summary>
  77. /// 获取配置文件中的appSettings节中的配置内容
  78. /// </summary>
  79. /// <param name="appSettingKey"></param>
  80. /// <param name="message"></param>
  81. /// <returns></returns>
  82. private string GetAppSettingValue(string appSettingKey)
  83. {
  84. ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = @"TDH.Parking.Client.exe.config" };
  85. return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).AppSettings.Settings[appSettingKey].Value;
  86. }
  1. byte[] bytesFile = Convert.FromBase64String(obj["byteArray"].ToString());

这里是拿到的字节流了。

这个方法可以解决在同一个解决方案中有多个项目可以读取到同一个项目下的App.config文件。

注意:其中有引用到的类库, 这是是用来操作压缩包的。

说下思路:第一步其实就是拿到压缩包的字节流再保存到本地,第二步就是循环读取压缩包的文件替换本地的文件,完成本地系统的版本更新。

无论简单与复杂,都需一步步向前方迈进。

C#自动更新本地程序的更多相关文章

  1. c#自动更新+安装程序的制作 (转)

    c#自动更新+安装程序的制作 (转)  http://blog.csdn.net/myhuli120/article/details/6927588 一.自动更新的实现 让客户端实现自动更新,通常做法 ...

  2. 怎样用VB自动更新应用程序

    具体程序实现如下:在应用程序工程MyApp中的部分代码如下:Option Explicit'编译后的应用程序名称,注意没有后缀 .EXE,本例为MYAPPPrivate Const App_Name ...

  3. c#自动更新+安装程序的制作

    一.自动更新的实现 让客户端实现自动更新,通常做法是在客户端部署一个单独的自动更新程序.主程序启动后,访问服务端,检查配置文件是否有更新版本,有更新版本就启动更新程序,由更新负责下载更新版本,并更新客 ...

  4. 自动更新本地 GIT 仓库

    随着开源软件的兴起,尤其是 GITHUB 的蓬勃发展,很多开源软件都通过 GIT 进行管理,在我的计算机上就一个目录是我关注并使用的开源软件 GIT 本地副本,如何定期更新这些仓库,一个个的更新太累人 ...

  5. C# 实现客户端程序自动更新

    看到一篇不错的帖子,可能以后会用到,果断收藏 文章来源 博客园jenry(云飞扬)http://www.cnblogs.com/jenry/archive/2006/08/15/477302.html ...

  6. WinForm应用程序中实现自动更新功能

    WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...

  7. Windows 程序自动更新方案: Squirrel.Windows

    Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...

  8. Web APP自动更新

    我们的手机软件每天都要经营,经常需要更新,比如程序的Bug,好的功能,好的洁面... ... 这就需要我们的用户打开web app时候自动更新客户端程序,而不是再去应用程序商店从新下载.今天的笔记就是 ...

  9. C#[WinForm]实现自动更新

    C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...

随机推荐

  1. Apache重定向URL

    (1)去除httpd.conf文件中"#LoadModule rewrite_module modules/mod_rewrite.so"前面的"#"号; (2 ...

  2. css预处理器 sass和stylus对比以及常用功能

    在众多的css预处理器语言中,sass和stylus算是十分优秀的两个.本文主要针对两者的常用功能做个简单的对比分析.在对比中了解二者的差异,同时帮助大家更好的掌握这两种预处理语言. 本文涉及到的sa ...

  3. android Activity启动过程(一)从startActivty开始说起

    从启动startActivity开始说起 MainActivity.startActivity() Activity.startActivity() Activity.startActivityFor ...

  4. python 获取当前时间及前一天时间

    import datetime from pandas.tseries.offsets import Day now_time =datetime.datetime.now()#获取当前时间 yes_ ...

  5. 3d Max 2013安装失败怎样卸载3dsmax?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  6. [转]jQuery为控件添加水印文字

    本文转自:http://www.cnblogs.com/gzh4455/archive/2011/09/29/2195418.html jQuery扩展: jquery.tinywatermark-3 ...

  7. Cloudera Manager卸载笔记

    1.通过管理平台分别停止组件服务和Cloudera Management Service 2.通过管理平台注销并移除Parcles (在控制台注销并移除,无论是安装的Parcles还是未安装的Parc ...

  8. 导出csv文件时韩文乱码解决方法

    从asp.net导出csv这样配置可以防止韩文等乱码,在头部加上0xEF, 0xBB, 0xBF: string fileName = "attachment;filename=" ...

  9. asp.net 单元测试(转)

    最早接触单元测试是看了极限编程相关资料里边讲的测试驱动开发,然后下载了Nunit研究了一下,但并没产生多大的触动,因为那个时候做的都是些时间紧任务重的事情,对于单元测试的直接感觉就是有可能比较费时间. ...

  10. C# 图像快速转化成byte[]和计算像素值

    public static unsafe byte[] ConvertTo8Byte(Bitmap img) { byte[] result = new byte[img.Width * img.He ...