• 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);
                  
                }
    
           
            }
    
    
    
    
    
    
        }
    }
    

      

  • 相关阅读:
    jquery判断设备是否是手机
    jQuery -- touch事件之滑动判断(左右上下方向)
    sass制作雪碧图
    js时间字符串转为标准时间
    装箱和拆箱
    Dictionary泛型集合实现山寨版金山词霸
    泛型集合
    ArrayList集合与索引器及Hashtable
    黑马程序员--静态方法和静态类
    黑马程序员--多态练习(手机工厂)
  • 原文地址:https://www.cnblogs.com/wgscd/p/10592483.html
Copyright © 2020-2023  润新知