利用第三方组件 ICSharpCode.SharpZipLib   download from:  https://github.com/icsharpcode/SharpZipLib

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
using System.IO;
using System.ComponentModel;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip; namespace OnlineUpdate
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
String[] arguments = Environment.GetCommandLineArgs();
bool valid = false;
foreach (string s in arguments)
{ //arguments =update|serverUrl|mainAPP
if (s.StartsWith ( "update|"))
{
serverUrl = s.Split ('|')[1].Trim() ;
mainAPP = s.Split('|')[2].Trim();
valid = true;
}
}
if (!valid)
{
Application.Current.Shutdown(); }
worker = new BackgroundWorker();
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); ;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
Loaded += new RoutedEventHandler(MainWindow_Loaded); } string AppFolder = AppDomain.CurrentDomain.BaseDirectory;
string mainAPP = "xx.exe";
string serverUrl = "";
BackgroundWorker worker;
bool isDownloadOK = false;
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (isDownloadOK)
{
copyFiles();
}
} void worker_DoWork(object sender, DoWorkEventArgs e)
{
dowloadFile();
} private static string UpdateZipFile = "Update.rar"; void MainWindow_Loaded(object sender, RoutedEventArgs e)
{ int tryCont=0;
closedMainApp();
while (!checkHasClosedMainApp())
{
tryCont++;
MessageBox.Show("请关闭["+mainAPP.Replace(".exe","")+"]再试!" );
if(tryCont>3){
MessageBox.Show("无法关闭" + mainAPP.Replace(".exe", "") + ".无法继续更新");
Application.Current.Shutdown();
break ;
} } Show();
//start download update
worker.RunWorkerAsync(); } void dowloadFile()
{
isDownloadOK = false;
string StrFileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, UpdateZipFile);
// string serverUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";//"https://files.cnblogs.com/files/wgscd/jyzsUpdate.zip"; //根据实际情况设置
System.IO.FileStream fs;
fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(serverUrl);
System.Net.WebResponse response = request.GetResponse();
System.IO.Stream ns = response.GetResponseStream();
long totalSize = response.ContentLength;
long hasDownSize = 0;
byte[] nbytes = new byte[512];//521,2048 etc
int nReadSize = 0;
nReadSize = ns.Read(nbytes, 0, nbytes.Length);
while (nReadSize > 0)
{
fs.Write(nbytes, 0, nReadSize);
nReadSize = ns.Read(nbytes, 0, 512);
hasDownSize += nReadSize;
Dispatcher.BeginInvoke(new Action(() =>
{
txt.Text = "" + hasDownSize + "/" + totalSize + " (" + (((double)hasDownSize * 100 / totalSize).ToString("0")) + "%)";//显示下载百分比
lbPercent.Width = gridPercent.RenderSize.Width * ((double)hasDownSize / totalSize);
txt.UpdateLayout();//DoEvents();
})); }
Dispatcher.BeginInvoke(new Action(() =>
{
txt.Text = "100%";//显示下载百分比
txt.UpdateLayout();//DoEvents();
})); fs.Close();
ns.Close();
isDownloadOK = true;
// MessageBox.Show("下载完成");
}
catch (Exception ex)
{
fs.Close();
MessageBox.Show("出现错误:" + ex.ToString());
}
} void copyFiles() {
try
{
txt.Text = "正在复制解压文件......";
txt2.Visibility = System.Windows.Visibility.Collapsed;
gridPercent.Visibility = System.Windows.Visibility.Collapsed;
UnZip(UpdateZipFile, AppFolder, "", true);
txt.Text = "更新完成!";
txt.FontSize = 55;
txt.Foreground = new SolidColorBrush(Colors.Green);
MessageBox.Show("恭喜更新完成!");
string mainApp = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, mainAPP);
System.Diagnostics.Process.Start(mainApp);
Application.Current.Shutdown();
}
catch(Exception ex) { MessageBox.Show("更新出错:\r\n"+ex.Message );
Application.Current.Shutdown();
} } /// <summary>
/// ZIP:解压一个zip文件
/// add yuangang by 2016-06-13
/// </summary>
/// <param name="ZipFile">需要解压的Zip文件(绝对路径)</param>
/// <param name="TargetDirectory">解压到的目录</param>
/// <param name="Password">解压密码</param>
/// <param name="OverWrite">是否覆盖已存在的文件</param>
public static void UnZip(string ZipFile, string TargetDirectory, string Password, bool OverWrite = true)
{
//如果解压到的目录不存在,则报错
if (!System.IO.Directory.Exists(TargetDirectory))
{
System.IO.Directory.CreateDirectory(TargetDirectory);
//throw new System.IO.FileNotFoundException("指定的目录: " + TargetDirectory + " 不存在!");
} //目录结尾
if (!TargetDirectory.EndsWith("\\")) { TargetDirectory = TargetDirectory + "\\"; } using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile)))
{
zipfiles.Password = Password;
ZipEntry theEntry; while ((theEntry = zipfiles.GetNextEntry()) != null)
{
string directoryName = "";
string pathToZip = "";
pathToZip = theEntry.Name; if (pathToZip != "")
directoryName = System.IO.Path.GetDirectoryName(pathToZip) + "\\"; string fileName = System.IO.Path.GetFileName(pathToZip);
Directory.CreateDirectory(TargetDirectory + directoryName);
if (fileName != "")
{
if ((File.Exists(TargetDirectory + directoryName + fileName) && OverWrite) || (!File.Exists(TargetDirectory + directoryName + fileName)))
{
using (FileStream streamWriter = File.Create(TargetDirectory + directoryName + fileName))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = zipfiles.Read(data, 0, data.Length); if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
streamWriter.Close();
}
}
}
} zipfiles.Close();
}
} /// <summary>
/// 断点续传
/// </summary>
void dowloadFileWithCache()
{
string StrFileName = "d:\\wgscd2.zip"; //根据实际情况设置
string StrUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";//"https://files.cnblogs.com/files/wgscd/xxx.zip"; //根据实际情况设置
//打开上次下载的文件或新建文件
long lStartPos = 0;
System.IO.FileStream fs;
if (System.IO.File.Exists(StrFileName))//另外如果文件已经下载完毕,就不需要再断点续传了,不然请求的range 会不合法会抛出异常。
{
fs = System.IO.File.OpenWrite(StrFileName);
lStartPos = fs.Length;
fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
}
else
{
fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
lStartPos = 0;
}
//打开网络连接
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
if (lStartPos > 0)
{
request.AddRange((int)lStartPos); //设置Range值
}
System.Net.WebResponse response = request.GetResponse();
//向服务器请求,获得服务器回应数据流
System.IO.Stream ns = response.GetResponseStream();
long totalSize = response.ContentLength;
long hasDownSize = 0;
byte[] nbytes = new byte[512];//521,2048 etc
int nReadSize = 0;
nReadSize = ns.Read(nbytes, 0, nbytes.Length);
while (nReadSize > 0)
{
fs.Write(nbytes, 0, nReadSize);
nReadSize = ns.Read(nbytes, 0, 512);
hasDownSize += nReadSize;
txt.Text = "" + hasDownSize + "/" + totalSize + " (" + (((double)hasDownSize * 100 / totalSize).ToString("0.00")) + "%)";//显示下载百分比
txt.UpdateLayout();//DoEvents();
}
fs.Close();
ns.Close();
MessageBox.Show("下载完成");
}
catch (Exception ex)
{
fs.Close();
MessageBox.Show("下载过程中出现错误:" + ex.ToString());
}
} bool checkHasClosedMainApp()
{ string path = ""; Process[] ps = Process.GetProcessesByName(mainAPP.Replace(".exe",""));
//string n= Process.GetCurrentProcess().MainModule.FileName;
foreach (Process p in ps)
{
path = p.MainModule.FileName.ToString();
return false;
} return true;
} void closedMainApp()
{ string path = ""; Process[] ps = Process.GetProcessesByName(mainAPP.Replace(".exe", ""));
//string n= Process.GetCurrentProcess().MainModule.FileName;
foreach (Process p in ps)
{
path = p.MainModule.FileName.ToString();
p.CloseMainWindow();
System.Threading.Thread.Sleep(1000); } } }
}

  

C# zip -ICSharpCode.SharpZipLib的更多相关文章

  1. zip (ICSharpCode.SharpZipLib.dll文件需要下载)

    ZipClass zc=new ZipClass (); zc.ZipDir(@"E:\1\新建文件夹", @"E:\1\新建文件夹.zip", 1);//压缩 ...

  2. 使用NPOI读取Excel报错ICSharpCode.SharpZipLib.Zip.ZipException:Wrong Local header signature

    写了一个小程序利用NPOI来读取Excel,弹出这样的报错: ICSharpCode.SharpZipLib.Zip.ZipException:Wrong Local header signature ...

  3. C#调用 ICSharpCode.SharpZipLib.Zip 实现解压缩功能公用类

    最近想用个解压缩功能 从网上找了找 加自己修改,个人感觉还是比较好用的,直接上代码如下 using System; using System.Linq; using System.IO; using ...

  4. ICSharpCode.SharpZipLib.dll,MyZip.dll,Ionic.Zip.dll 使用

    MyZip.dll : 有BUG,会把子目录的文件解压到根目录.. ICSharpCode.SharpZipLib.dll: 把ICSharpCode.SharpZipLib.dll复制一份,重命名为 ...

  5. 利用ICSharpCode.SharpZipLib.Zip进行文件压缩

    官网http://www.icsharpcode.net/ 支持文件和字符压缩. 创建全新的压缩包 第一步,创建压缩包 using ICSharpCode.SharpZipLib.Zip; ZipOu ...

  6. C# zip/unzip with ICSharpCode.SharpZipLib

    download ICSharpCode and add reference using System; using System.Collections.Generic; using System. ...

  7. 使用ICSharpCode.SharpZipLib.Zip实现压缩与解压缩

    使用开源类库ICSharpCode.SharpZipLib.Zip可以实现压缩与解压缩功能,源代码和DLL可以从http://www.icsharpcode.net/OpenSource/SharpZ ...

  8. ICSharpCode.SharpZipLib.Zip

    //压缩整个目录下载 var projectFolder = Request.Params["folder"] != null ? Request.Params["fol ...

  9. 基于ICSharpCode.SharpZipLib.Zip的压缩解压缩

    原文:基于ICSharpCode.SharpZipLib.Zip的压缩解压缩 今天记压缩解压缩的使用,是基于开源项目ICSharpCode.SharpZipLib.Zip的使用. 一.压缩: /// ...

随机推荐

  1. iOS---------如何搭建ipv6环境

    第一步:首先打开共享 第二步:点击互联网共享,然后按option键.会出现创建NAT64网络 第三步:点击Wi-Fi共享,设置网络名称,频段:11.安全性:WPA2个人级.密码设置8位就可以了.然后在 ...

  2. Java虚拟机(五)Java的四种引用级别

    1.前言 HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活.如果reference类型的数据中存储的数值代表的 ...

  3. Centos 7 查看内存占用情况相关命令

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80652626 本文出自[赵彦军的博客] 1. top命令 top命令经常用来监控l ...

  4. git 入门教程之初识git

    初识 git git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 背景 我们都知道,Linus 在1991年创建了开源的linux系统,随着不断发展壮大,目前已发展成为最大 ...

  5. GIT基本命令介绍

    1.git remote git remote -v| --verbose 查看仓库详细信息 git remote add <name> <url> 关联远程库.如果你本地新建 ...

  6. Oracle根据已有表的数据建立新表

    需要保证create的表内的字段与select的表一致. create table 表名(字段名,字段名,字段名,字段名,字段名,字段名) as select * from 表名

  7. 一套简单的git版本控制代码

    对于博客来说,我还是直接实践比较好,理论过多,不方便以后的查看 废话不多,直接开干 功能需求: .公司需要将jenkins打包出来的压缩包通过git上传到git服务器 .而且通过版本控制上传的文件,即 ...

  8. AspNet mvc的一个bug

    [HttpPost] public ActionResult updateLoan(TuWenMilitaryRank entity) 使用mvc绑定表单 每次绑定的对象都为null,查看Reques ...

  9. Windows和Linux之间 rsync数据同步

    转载于   https://www.linuxidc.com/Linux/2014-01/95722p2.htm rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——rem ...

  10. nginx基本配置与参数说明

    user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes  1;   #全局错误日志及PID文件 #error_log  logs/error.log; # ...