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
{
Dictionary<string, string> postDic = new Dictionary<string, string>();
//获取文件内的版本号
if(File.Exists(document))
{
postDic.Add("version", File.ReadAllText(document).Trim());
}
else
{
postDic.Add("version", "");
} 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#自动更新本地程序的更多相关文章
- c#自动更新+安装程序的制作 (转)
c#自动更新+安装程序的制作 (转) http://blog.csdn.net/myhuli120/article/details/6927588 一.自动更新的实现 让客户端实现自动更新,通常做法 ...
- 怎样用VB自动更新应用程序
具体程序实现如下:在应用程序工程MyApp中的部分代码如下:Option Explicit'编译后的应用程序名称,注意没有后缀 .EXE,本例为MYAPPPrivate Const App_Name ...
- c#自动更新+安装程序的制作
一.自动更新的实现 让客户端实现自动更新,通常做法是在客户端部署一个单独的自动更新程序.主程序启动后,访问服务端,检查配置文件是否有更新版本,有更新版本就启动更新程序,由更新负责下载更新版本,并更新客 ...
- 自动更新本地 GIT 仓库
随着开源软件的兴起,尤其是 GITHUB 的蓬勃发展,很多开源软件都通过 GIT 进行管理,在我的计算机上就一个目录是我关注并使用的开源软件 GIT 本地副本,如何定期更新这些仓库,一个个的更新太累人 ...
- C# 实现客户端程序自动更新
看到一篇不错的帖子,可能以后会用到,果断收藏 文章来源 博客园jenry(云飞扬)http://www.cnblogs.com/jenry/archive/2006/08/15/477302.html ...
- WinForm应用程序中实现自动更新功能
WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...
- Windows 程序自动更新方案: Squirrel.Windows
Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...
- Web APP自动更新
我们的手机软件每天都要经营,经常需要更新,比如程序的Bug,好的功能,好的洁面... ... 这就需要我们的用户打开web app时候自动更新客户端程序,而不是再去应用程序商店从新下载.今天的笔记就是 ...
- C#[WinForm]实现自动更新
C#[WinForm]实现自动更新 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...
随机推荐
- ubuntu hadoop集群 master免密码登陆到slave节点
1. 在master节点上安装ssh client,在slave节点上安装ssh server sudo apt-get install openssh-client sudo apt-get ins ...
- python django bootstrap_导入 201901
参考 http://www.liujiangblog.com/course/django/124 AdminLTE-2.4.5 http://www.liujiangblog.com/course/d ...
- eclipse_project
转!java web项目 build path 导入jar包,tomcat启动报错 找不到该类 在eclipse集成tomcat开发java web项目时,引入的外部jar包,编译通过,但启动tomc ...
- c++中 重载 覆盖 隐藏的区别 附加 mutable笔记
成员函数被重载的特征有: 1) 相同的范围(在同一个类中): //2) 函数名字相同: 3) 参数不同: 4) virtual关键字可有可无. 覆盖的特征有: 1) 不同的范围(分别位于派生类与基类) ...
- linux 查看页大小
# getconf PAGE_SIZE 一般是4096
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- 使用mspaint查看图片像素
图片打码服务,要求对图像验证码进行切图,即具体知道像素的位置,网上搜了yhb-chi但下载不方便. 就想着看看mspaint可不可以,将图片拖到mspaint中: 显示了整张图片的像素大小(100X4 ...
- HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- OC与JS交互之UIWebView
随着H5的强大,hybrid app已经成为当前互联网的大方向,单纯的native app和web app在某些方面显得就很劣势.关于H5的发展史,这里有一篇文章推荐给大家,今天我们来学习最基础的基于 ...
- gof23 适配器模式
namespace Adapter { class Program { static void Main(string[] args) { //原实现 ClassBase customa = new ...