winform 更新下载压缩文件解压并覆盖
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;
using UpdateDevForm.Response; namespace UpdateDevForm
{
public partial class UpdateForm : Form
{
public readonly string UpdateFiles = Path.Combine(Application.StartupPath, "update");//解压到的本机地址
public string CheckUpdateURL; //更新包所在网络地址(服务器端的路径)
public string resourcetype; //安装方式 :重新安装 0,文件覆盖 1
public string resourcename; //文件名称带后缀名 public UpdateForm()
{
InitializeComponent();
} private void UpdateForm_Load(object sender, EventArgs e)
{ if (!UpdateHelper.IsConnectInternet())
{
MessageBox.Show("网络异常,请检查网络连接", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
} ResponseResult<UpdateInfo> updateInfo = UpdateHelper.GetUpdateInfo("Windows_CSOnline");
if (updateInfo == null)
{
#if DEBUG
UpdateHelper.StartKillProcess(System.IO.Path.Combine(@"E:\xx\xx\xx\\bin\Debug", @"xxx.exe"), "UpdateDevForm");
#else
UpdateHelper.StartKillProcess(System.IO.Path.Combine(Application.StartupPath, @"xxx.exe"), "UpdateDevForm");
#endif
}
else
{
CheckForIllegalCrossThreadCalls = false;
Thread t = new Thread(() =>
{
if (!System.IO.Directory.Exists(UpdateFiles))
{
System.IO.Directory.CreateDirectory(UpdateFiles);
}
CheckUpdateURL = updateInfo.content.resourceUri.ToString();
resourcetype = updateInfo.content.resourceType;
resourcename = updateInfo.content.resourceName; using (WebClient webClient = new WebClient())
{
try
{ //通过webclient下载服务器端的文件
webClient.DownloadFile(new Uri(CheckUpdateURL), UpdateFiles + "\\" + resourcename);
}
catch (WebException ex)
{
MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
} if (int.Parse(resourcetype) == 1) //文件覆盖
{
bool ConverFileResult = ConverFile(UpdateFiles, resourcename); if (!ConverFileResult)
{
MessageBox.Show("更新失败", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
else if (int.Parse(resourcetype) == 0) //重新安装
{
bool ReinstallResult = Reinstall(UpdateFiles + "\\" + resourcename);
if (!ReinstallResult)
{
MessageBox.Show("更新失败", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
} UpdateBLL updateBLL = new UpdateBLL();
int count = updateBLL.Update("Versions", updateInfo.content.version);
if (count > 0)
{ } MessageBox.Show("更新成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
UpdateHelper.StartKillProcess("xxx.exe", "UpdateDevForm");
});
t.IsBackground = true;
t.Start(); } }
/// <summary>
/// 重新安装
/// </summary>
/// <param name="MsiFilesUrl"></param>
/// <returns></returns>
private bool Reinstall(string MsiFilesUrl)
{
this.Hide(); Process UninstallProcess = new Process(); //卸载进程
UninstallProcess.StartInfo.FileName = "msiexec";
UninstallProcess.StartInfo.Arguments = "/x {2ED75D70-FC7F-469C-9F71-24CB3A4E923C}";
UninstallProcess.Start();
UninstallProcess.WaitForExit();
if (UninstallProcess.ExitCode == 0)
{ Process installProcess = new Process(); //安装进程
MessageBox.Show(MsiFilesUrl);
installProcess.StartInfo.FileName = MsiFilesUrl;
installProcess.StartInfo.Arguments = "";
installProcess.Start();
installProcess.WaitForExit();
if (installProcess.ExitCode == 0)
{ installProcess.Close();
return true;
}
else
{
installProcess.Close();
return false;
} }
else
{
UninstallProcess.Close();
return false;
} } /// <summary>
/// 文件覆盖
/// </summary>
/// <param name="zip_path">zip文件所在路径</param>
/// <param name="resourcename">zip更新包文件名带后缀</param>
/// <returns></returns>
private bool ConverFile(string zip_path, string resourcename)
{
string filename = zip_path + "\\" + resourcename;
if (!File.Exists(filename))
{
MessageBox.Show("下载更新包文件失败!");
Application.Exit();
} FastZip zip = new FastZip();
zip.ExtractZip(filename, Application.StartupPath, ""); #region .NET Framework下此方法不能覆盖文件 .NET Core下此方法可以覆盖使用
// 引入 System.IO.Compression;
// ZipFile.ExtractToDirectory(filename, Application.StartupPath);
#endregion if (File.Exists(filename))
{
File.Delete(filename);//覆盖完成之后删除zip文件
return true;
} return false;
} }
}
winform 更新下载压缩文件解压并覆盖的更多相关文章
- java压缩文件解压:调用WinRAR5命令强于自己写代码实现
最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.j ...
- SharpCompress的压缩文件解压和文件夹压缩
1.前言 最近做一个功能需要用到对压缩文件的解压,就找到了这个SharpCompress不错,还能解压rar的文件.但是网上的资料和我拿到的SharpCompress.dll的方法有些出入,所以我就自 ...
- 《OD学hadoop》在LINUX下如何将tar压缩文件解压到指定的目录下
linux下tar命令解压到指定的目录 :#tar zxvf /bbs.tar.zip -C /zzz/bbs //把根目录下的bbs.tar.zip解压到/zzz/bbs下,前提要保证存在/zzz/ ...
- linux压缩文件——解压方法
linux下 tar解压 gz解压 bz2等各种解压文件使用方法 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar ...
- ubuntu 各压缩文件解压命令大全
.tar 解包:tar xvf xxx.tar 打包:tar cvf xxx.tar DirName (注:tar是打包,不是压缩!) .gz 解压1:gunzip FileName.gz 解压2:g ...
- Linux 学习笔记 5 文件的下载、压缩、解压、初步认识yum
写在前面 上节我们通过简单的几组命令,已经完全的实现了文件的移动.删除.更名.以及复制,我们最常用的基本玩法,本节将带着大家学习压缩.解压的相关步骤. Linux 学习笔记 4 创建.复制.移动.文件 ...
- 16 Linux系统的文件压缩、解压与归档
这一节的内容,我们详细介绍下Linux的文件压缩.解压缩与文件归档的内容,也就是tar.gzip.bzip2.xz等命令的内容: 压缩(compress)与解压缩(uncompress) Linux系 ...
- Linux 下 zip 文件解压乱码解决方案,ubuntu16.10亲测可用
文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: ...
- Linux系列之压缩与解压
1.压缩技术 1.常用命令实例 1.zip格式的压缩与解压缩 zip是压缩指令,unzip是解压指令.zip指令既可以压缩文件,也可以压缩目录.压缩会自动保留源文件,解压会自动保留压缩文件. zip ...
- Linux | 压缩与解压详解
tar tar 命令用于对文件进行打包压缩或解压,格式: tar [选项][文件] tar命令的参数及其作用 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 ...
随机推荐
- scratch图形化编程教程
1. scratch软件 市面上类似于scratch这种图形化编程的软件非常多,各个品牌的都有,而且每个品牌之后的风格.界面布局也是不同的,所以我会简单的列举一些对应软件. scratch3.0 优点 ...
- Python导入Excel表格数据并以字典dict格式保存
本文介绍基于Python语言,将一个Excel表格文件中的数据导入到Python中,并将其通过字典格式来存储的方法. 我们以如下所示的一个表格(.xlsx格式)作为简单的示例.其中,表格共有两 ...
- 看不懂打我系列------图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用
@图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用 简体中文 | English 说明 本文介绍如何在CentOS Linux ...
- http协议的请求方式
协议 协议,就是通信双方去定义的一堆数据格式,并且共同遵守的标准. HTTP协议 HTTP是一个基于TCP/IP通信协议来传递数据,包括html文件.图像.结果等,即是一个客户端和服务器端请求和应答的 ...
- 前端知识点(js部分)
目录 一.JS简介 简介 ECMAScript的历史 二.JS基础 1.注释语法 2.引入js的多种方式 3.结束符号 三.变量与常量 编写和运行js代码的两种方式 变量声明 四.基本数据类型 1.数 ...
- Springboot返回数据给前端-参数为null处理
转:https://www.pianshen.com/article/950119559/ 1.返回对象参数为null时,该参数选择显示或者不显示 在返回参数给前端的时候,有些参数的值为null的时候 ...
- 【CTO变形记】高维视角,跳出“农场主与火鸡”
前言:看待人事物的角度决定了我们的思考方向和处理事情的方式.在这些认识人事物的过程中,导致了一些"事故"发生:就好比"以手指月",原本要看"月亮&qu ...
- C++ 练习10 动态分配内存
动态分配内存可以使的程序在内存中更加灵活地使用 动态分配数组使用new函数 1 #include <iostream> 2 constexpr auto N = 5; 3 using na ...
- Redhat7.6搭建LAMP环境
关闭防火墙和 selinux# systemctl stop firewalld systemctl disable firewalld 禁用 Selinux vim /etc/selinux/con ...
- python-最近面试遇到的代码题,mark一下
1. 打印1000以内的质数 draft版本: def printlist(): a = [] for i in range(1, 1001): b.append(i) for j in range( ...