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 更新下载压缩文件解压并覆盖的更多相关文章

  1. java压缩文件解压:调用WinRAR5命令强于自己写代码实现

    最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.j ...

  2. SharpCompress的压缩文件解压和文件夹压缩

    1.前言 最近做一个功能需要用到对压缩文件的解压,就找到了这个SharpCompress不错,还能解压rar的文件.但是网上的资料和我拿到的SharpCompress.dll的方法有些出入,所以我就自 ...

  3. 《OD学hadoop》在LINUX下如何将tar压缩文件解压到指定的目录下

    linux下tar命令解压到指定的目录 :#tar zxvf /bbs.tar.zip -C /zzz/bbs //把根目录下的bbs.tar.zip解压到/zzz/bbs下,前提要保证存在/zzz/ ...

  4. linux压缩文件——解压方法

    linux下 tar解压 gz解压 bz2等各种解压文件使用方法 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar ...

  5. ubuntu 各压缩文件解压命令大全

    .tar 解包:tar xvf xxx.tar 打包:tar cvf xxx.tar DirName (注:tar是打包,不是压缩!) .gz 解压1:gunzip FileName.gz 解压2:g ...

  6. Linux 学习笔记 5 文件的下载、压缩、解压、初步认识yum

    写在前面 上节我们通过简单的几组命令,已经完全的实现了文件的移动.删除.更名.以及复制,我们最常用的基本玩法,本节将带着大家学习压缩.解压的相关步骤. Linux 学习笔记 4 创建.复制.移动.文件 ...

  7. 16 Linux系统的文件压缩、解压与归档

    这一节的内容,我们详细介绍下Linux的文件压缩.解压缩与文件归档的内容,也就是tar.gzip.bzip2.xz等命令的内容: 压缩(compress)与解压缩(uncompress) Linux系 ...

  8. Linux 下 zip 文件解压乱码解决方案,ubuntu16.10亲测可用

    文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: ...

  9. Linux系列之压缩与解压

    1.压缩技术 1.常用命令实例 1.zip格式的压缩与解压缩 zip是压缩指令,unzip是解压指令.zip指令既可以压缩文件,也可以压缩目录.压缩会自动保留源文件,解压会自动保留压缩文件. zip  ...

  10. Linux | 压缩与解压详解

    tar tar 命令用于对文件进行打包压缩或解压,格式: tar [选项][文件] tar命令的参数及其作用 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 ...

随机推荐

  1. Codeforces Round #569 (Div. 2)

    题解 Codeforces Round #569 (Div. 2) rank:1306/11165 rate: +43 1424 → 1467 Codeforces Round #569 (Div. ...

  2. 解决微信小程序 自定义tabBar 切换时候闪烁问题

    这个闪烁真的很迷 我搜了一些资料,进行了以下步骤的操作 第一种解决办法 ,把tabbar自定义组件的this.setData中的代码注释掉 显示tabbar中的页面中,添加下面的:这个好像没什么用啊 ...

  3. 上传图片文件并立即显示到页面使用 javascript实现鼠标拖动画矩形框以及实现固定区域内随意拖动

    首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法其次,要了解容什么方式,画一个矩形,设计一个方法:DrawRectgle(左上角,右下角),并且要确定当调用这个方法时, ...

  4. 腾讯出品小程序自动化测试框架【Minium】系列(四)API详解(上)

    写在前面 不知道是不是因为之前出过书的原因,在写教程之类的文章,会潜意识有自带目录和章节的感觉在里面,有点说不出的感觉吧. 上篇文章我们介绍了关于元素定位的使用方法,这篇文章将为大家分享关于Miniu ...

  5. 应用容器引擎-Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化.容器是完全使用沙箱 ...

  6. C# 线程同步查漏补缺

    同步构造 当线程 A 在等待一个同步构造,另一个线程 B 持有构造一直不释放,那么就会导致线程 A 阻塞.同步构造有用户模式构造和内核模式构造. 用户模式构造通过 CPU 指令来协调线程,所以速度很快 ...

  7. sync.Once 使用及解析

    目录 前言 1. sync.Once 简介 2. sync.Once 源码解析 2.1 为什么 done 作为第一个字段 2.2 Do 方法的实现细节 2.3 其他重要细节 3. sync.Once ...

  8. KStudio-Java程序连接KingbaseES数据库异常

    错误信息: --KStudio客户端工具错误信息 The conncetion attempt failed.Reason:connect time out --Java应用程序控制台日志 Cause ...

  9. Docker命令的自动补齐

    Docker命令的自动补齐 背景 在linux下输入命令或文件都是可以自动补齐的,这个特性极大的提高了我们的效率,多数情况下我们很少用命令参数的自动补齐. 但对docker git这类参数特别多的命令 ...

  10. 力扣每日一题2023.1.19---2299. 强密码检验器 II

    如果一个密码满足以下所有条件,我们称它是一个 强 密码:    它有至少 8 个字符.    至少包含 一个小写英文 字母.    至少包含 一个大写英文 字母.    至少包含 一个数字 .    ...