• C# online update demo


    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)
                {
                    if (s == "update")
                    {
                        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);
            
             
            }
            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("please close main app");
                     if(tryCont>3){
                        MessageBox.Show("can not do update ,need close main app");
                         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 StrUrl = "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(StrUrl);
                    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() {
    
                txt.Text = "正在复制解压文件......";
                txt2.Visibility = System.Windows.Visibility.Collapsed;
                gridPercent.Visibility = System.Windows.Visibility.Collapsed;
                UnZip(UpdateZipFile, AppDomain.CurrentDomain.BaseDirectory, "");
                txt.Text = "更新完成!";
                txt. FontSize = 55;
                txt.Foreground = new SolidColorBrush(Colors.Green);
                MessageBox.Show("update Ok, now new version will start");
                string mainApp = AppDomain.CurrentDomain.BaseDirectory + "\JiayuanTool.exe";
                System.Diagnostics.Process.Start(mainApp);
                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("JiayuanTool");
               //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("JiayuanTool");
                //string n=  Process.GetCurrentProcess().MainModule.FileName;
                foreach (Process p in ps)
                {
                    path = p.MainModule.FileName.ToString();
                    p.CloseMainWindow(); 
                    System.Threading.Thread.Sleep(1000);
                  
                }
    
           
            }
    
    
    
    
    
    
        }
    }
    

      

    UI :

    <Window x:Class="OnlineUpdate.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TextBlock Name="txt" HorizontalAlignment="Center" FontSize="22" VerticalAlignment="Center" Margin="12,-42,0,0">000/0000</TextBlock>
            <Grid Name="gridPercent" Background="WhiteSmoke" VerticalAlignment="Center" Margin="12,22,0,0">
                <Label  Name="lbPercent" Background="Green" Width="0" HorizontalAlignment="Left"></Label>
            </Grid>   
            <Label Name="txt2" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center"  Margin="0,80,0,0">正在下载更新...</Label>
    
          
        </Grid>
    </Window>
    

      

  • 相关阅读:
    .NET 开源框架
    ORM 开发框架
    C# 文件下载四方法
    用ASP.net判断上传文件类型的三种方法
    站在十字路口的程序媛,该如何选择?
    突然的烦恼
    Request获取url信息的各种方法比较 及 Request.UrlReferrer详解
    JS 获得当前地址栏url
    MvcPager 概述
    Simditor使用方法
  • 原文地址:https://www.cnblogs.com/wgscd/p/9431571.html
Copyright © 2020-2023  润新知