C# zip -ICSharpCode.SharpZipLib

利用第三方组件 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("更新出错:
"+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);
              
            }

       
        }






    }
}

  

原文地址:https://www.cnblogs.com/wgscd/p/10592483.html