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程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个 ...
随机推荐
- java——newInstance()方法和new关键字
https://www.cnblogs.com/liuyanmin/p/5146557.html 这两个都可以创建一个对象,那么这样个东西有什么不一样呢?什么时候用new,什么时候用newInstan ...
- my.资料收集
1.平民打书想上个高级反击,高级反击会掉哪个呢[梦幻西游手游吧]_百度贴吧.html http://tieba.baidu.com/p/5292257591?lp=5028&mo_device ...
- python_案例综合:教材记录管理
class Book(): def __init__(self,ISBN,Ftile,Author,Publisher): self.ISBN = ISBN self.Ftile = Ftile se ...
- svn被锁 The project was not built due to "org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir
解决办法 : 右键该项目 ,---->Team---->选"Team"-->"Refresh/Cleanup",并确认"Ref ...
- maya2012无法安装卸载激活失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- Fedora14 mount出现错误时解决办法【亲测有效】
挂载时出现了如上图所示问题,看第一条英语提示,我刚开始以为是文件权限不够,改了权限之后,依旧存在这样的问题, 于是,我上网查阅了一些资料: 在解决之前,先让我们一起来了解一下nfs: NFS最大功能就 ...
- 使用@Cacheable 踩过的坑
public class XXX{ @Resourceprivate XXX self;//@Cacheable通过内部调用将不会使用缓存,从Spring4.3开始可以通过注入self,再通过self ...
- Spring课程 Spring入门篇 2-2 Spring注入方式
课程链接: 本节主要讲了以下两块内容: 1 xml两种注入方式 2 注入方式代码实现 3 特别注意 1 xml两种注入方式 构造注入和set注入 2 注入方式代码实现 2.1 set注入方式的实现 实 ...
- Sass基础(二)
五.嵌套 在Sass中,嵌套有三种方式:选择器嵌套.属性嵌套.伪类嵌套 1.选择器嵌套 2.属性嵌套 3.伪类嵌套 六.混合宏 当样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无法达到目的了 ...
- python反爬之用户代理
# requests是第三方库,需要安装 pip install requests import requests import random # 通常很多网站都会设置检测请求头中的User-Agen ...