zoukankan      html  css  js  c++  java
  • c# winform 自动升级

    winform自动升级程序示例源码下载 

    客户端思路:

    1、新建一个配置文件Update.ini,用来存放软件的客户端版本:

    [update] version=2011-09-09 15:26

    2、新建一个单独的客户端升级程序Update.exe:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using System.Net;

    using System.Threading;

    using System.Diagnostics;

    using System.IO;

     

    namespace Update

    {

        publicpartialclassFrmUpdate : Form

        {

            //关闭进度条的委托

            publicdelegatevoidCloseProgressDelegate();

            //声明关闭进度条事件

            publiceventCloseProgressDelegate CloseProgress;

            UpdateService.Service service = null;//webservice服务

            WebClient wc = null;

            string url;//获取下载地址

            string[] zips;//获取升级压缩包

            int zipsIndex = 0;//当前正在下载的zips下标

     

            long preBytes = 0;//上一次下载流量

            long currBytes = 0;//当前下载流量

            public FrmUpdate()

            {

                InitializeComponent();

                service = new UpdateService.Service();//webservice服务

                url = service.GetUrl();//获取下载地址               

                zips = service.GetZips();//获取升级压缩包

            }

     

            privatevoid FrmUpdate_Load(object sender, EventArgs e)

            {

                try

                {

                    //用子线程工作

                    Thread t = newThread(newThreadStart(DownLoad));

                    t.IsBackground = true;//设为后台线程

                    t.Start();

                }

                catch (Exception ex)

                {

                    MessageBox.Show(ex.Message);

                }

            }

     

            /// <summary>

            /// 下载更新

            /// </summary>

            privatevoid DownLoad()

            {

                try

                {

                    CloseProgress += newCloseProgressDelegate(FrmUpdate_CloseProgress);

                    if (zips.Length > 0)

                    {

                        wc = newWebClient();

                        wc.DownloadProgressChanged += newDownloadProgressChangedEventHandler(wc_DownloadProgressChanged);

                        wc.DownloadFileCompleted += newAsyncCompletedEventHandler(wc_DownloadFileCompleted);

                        wc.DownloadFileAsync(newUri(url + zips[zipsIndex]), zips[zipsIndex]);

                    }

                    else

                    {

                        FrmUpdate_CloseProgress();//调用关闭进度条事件

                    }

                }

                catch (Exception ex)

                {

                    MessageBox.Show(ex.Message);

                }

            }

            /// <summary>

            /// 下载完成后触发

            /// </summary>

            void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)

            {

                zipsIndex++;

                if (zipsIndex < zips.Length)

                {

                    //继续下载下一个压缩包

                    wc = newWebClient();

                    wc.DownloadProgressChanged += newDownloadProgressChangedEventHandler(wc_DownloadProgressChanged);

                    wc.DownloadFileCompleted += newAsyncCompletedEventHandler(wc_DownloadFileCompleted);

                    wc.DownloadFileAsync(newUri(url + zips[zipsIndex]), zips[zipsIndex]);

                }

                else

                {

                    //解压

                    int maximum = ZipClass.GetMaximum(zips);

                    foreach (string zip in zips)

                    {

                        ZipClass.UnZip(Application.StartupPath + @"" + zip, "", maximum, FrmUpdate_SetProgress);

                        File.Delete(Application.StartupPath + @"" + zip);

                    }

                    FrmUpdate_CloseProgress();//调用关闭进度条事件

                }

            }

            /// <summary>

            /// 下载时触发

            /// </summary>

            void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)

            {

                if (this.InvokeRequired)

                {

                    this.Invoke(newDownloadProgressChangedEventHandler(wc_DownloadProgressChanged), newobject[] { sender, e });

                }

                else

                {

                    label1.Text = "正在下载自解压包" + zips[zipsIndex] + "(" + (zipsIndex + 1).ToString() + "/" + zips.Length + ")";

                    progressBar1.Maximum = 100;

                    progressBar1.Value = e.ProgressPercentage;

     

                    currBytes = e.BytesReceived;//当前下载流量

                }

            }

            /// <summary>

            /// 解压时进度条事件

            /// </summary>

            /// <param name="maximum">进度条最大值</param>

            privatevoid FrmUpdate_SetProgress(int maximum, string msg)

            {

                if (this.InvokeRequired)

                {

                    this.Invoke(new ZipClass.SetProgressDelegate(FrmUpdate_SetProgress), newobject[] { maximum, msg });

                }

                else

                {

                    if (zipsIndex == zips.Length)

                    {

                        //刚压缩完

                        progressBar1.Value = 0;

                        zipsIndex++;

                    }

                    label1.Text = "正在解压" + msg + "(" + (progressBar1.Value + 1).ToString() + "/" + maximum + ")";

                    progressBar1.Maximum = maximum;

                    progressBar1.Value++;

                }

            }

     

            /// <summary>

            /// 实现关闭进度条事件

            /// </summary>

            privatevoid FrmUpdate_CloseProgress()

            {

                if (this.InvokeRequired)

                {

                    this.Invoke(newCloseProgressDelegate(FrmUpdate_CloseProgress), null);

                }

                else

                {

                    if (wc != null)

                    {

                        wc.Dispose();

                    }

                    if (zips.Length > 0)

                    {

                        MessageBox.Show("升级成功!");

                    }

                    else

                    {

                        MessageBox.Show("未找到升级包!");

                    }

                    IniClass ini = new IniClass(Application.StartupPath + @"Update.ini");

                    string serviceVersion = service.GetVersion();//服务端版本

                    ini.IniWriteValue("update", "version", serviceVersion);//更新成功后将版本写入配置文件

                    Application.Exit();//退出升级程序

                    Process.Start("Main.exe");//打开主程序Main.exe

                }

            }

     

            //1秒计算一次速度

            privatevoid timer1_Tick(object sender, EventArgs e)

            {

                this.Text = ((currBytes - preBytes) / 1024).ToString() + "kb/s";//速度

                preBytes = currBytes;//上一次下载流量

            }

        }

    }

    解压类ZipClass.cs:引用 ICSharpCode.SharpZipLib.dll

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Windows.Forms;

    using System.IO;

    using ICSharpCode.SharpZipLib;

    using ICSharpCode.SharpZipLib.Checksums;

    using ICSharpCode.SharpZipLib.Zip;

     

    namespace Update

    {

        publicclassZipClass

        {

            //设置进度条的委托

            publicdelegatevoidSetProgressDelegate(int maximum, string msg);

            #region 解压

            /// <summary>  

            /// 功能:解压zip格式的文件。  

            /// </summary>  

            /// <param name="zipFilePath">压缩文件路径,全路径格式</param>  

            /// <param name="unZipDir">解压文件存放路径,全路径格式,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>  

            /// <param name="err">出错信息</param>  

            /// <returns>解压是否成功</returns>  

            publicstaticbool UnZip(string zipFilePath, string unZipDir, int maximum, SetProgressDelegate setProgressDelegate)

            {

                if (zipFilePath == string.Empty)

                {

                    thrownew System.IO.FileNotFoundException("压缩文件不不能为空!");

                }

                if (!File.Exists(zipFilePath))

                {

                    thrownew System.IO.FileNotFoundException("压缩文件: " + zipFilePath + " 不存在!");

                }

                //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹  

                if (unZipDir == string.Empty)

                    unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), "");

                if (!unZipDir.EndsWith("//"))

                    unZipDir += "//";

                if (!Directory.Exists(unZipDir))

                    Directory.CreateDirectory(unZipDir);

     

                try

                {

                    using (ZipInputStream s = newZipInputStream(File.OpenRead(zipFilePath)))

                    {

                        ZipEntry theEntry;

                        while ((theEntry = s.GetNextEntry()) != null)

                        {

                            string directoryName = Path.GetDirectoryName(theEntry.Name);

                            string fileName = Path.GetFileName(theEntry.Name);

                            if (directoryName.Length > 0)

                            {

                                Directory.CreateDirectory(unZipDir + directoryName);

                            }

                            if (!directoryName.EndsWith("//"))

                                directoryName += "//";

                            if (fileName != String.Empty)

                            {

                                using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))

                                {

     

                                    int size = 2048;

                                    byte[] data = newbyte[2048];

                                    while (true)

                                    {

                                        size = s.Read(data, 0, data.Length);

                                        if (size > 0)

                                        {

                                            streamWriter.Write(data, 0, size);

                                        }

                                        else

                                        {

                                            setProgressDelegate(maximum, theEntry.Name);

                                            break;

                                        }

                                    }

                                }

                            }

                        }//while  

                    }

                }

                catch (Exception ex)

                {

                    thrownewException(ex.Message);

                }

                returntrue;

            }//解压结束 

            #endregion

     

            publicstaticint GetMaximum(string[] zips)

            {

                int maximum = 0;

                ZipInputStream s = null;

                ZipEntry theEntry = null;

                foreach (string zip in zips)

                {

                    s = newZipInputStream(File.OpenRead(Application.StartupPath + @"" + zip));

                    while ((theEntry = s.GetNextEntry()) != null)

                    {

                        if (Path.GetFileName(theEntry.Name) != "")

                        {

                            maximum++;

                        }

                    }

                }

                if (s != null)

                {

                    s.Close();

                }

                return maximum;

            }

        }

    }

     3、将update.ini和Update.exe复制到主程序目录,主程序登录时判断客户端版本是否与服务端版本相同,如不同,则做升级:

    IniClass ini = newIniClass(Application.StartupPath + @"Update.ini");

                    UpdateService.Service service = new UpdateService.Service();

                    string clientVersion = ini.IniReadValue("update", "version");//客户端版本

                    string serviceVersion = service.GetVersion();//服务端版本

                    if (clientVersion != serviceVersion)

                    {

                        DialogResult dialogResult = MessageBox.Show("有新版本,是否更新?", "升级", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                        if (dialogResult == DialogResult.OK)

                        {

                            Application.Exit();

                            Process.Start("Update.exe");

                        }

                    }

                    else

                    {

                        MessageBox.Show("已更新至最高版本!");

                    }

     

    服务端思路:

    1、新建一个Web Service,在Web.Config中配置:

      <connectionStrings>

        <!--版本号-->

        <add name="version" connectionString="2011-09-20 15:17"/>

        <!--下载地址-->

        <add name="url" connectionString ="http://localhost:8546/WebSite/"/>

        <!--下载目录,最好为一级目录免得麻烦-->

        <add name="directory" connectionString ="UpdateFile"/>

      </connectionStrings>

    2、在Service.cs写入以下代码:

    using System;

    using System.Web;

    using System.Web.Services;

    using System.Web.Services.Protocols;

    using System.IO;

    using System.Configuration;

     

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    publicclassService : System.Web.Services.WebService

    { 

        public Service()

        { 

            //如果使用设计的组件,请取消注释以下行

            //InitializeComponent();

        }

        /// <summary>

        /// 获取版本号

        /// </summary>

        /// <returns>更新版本号</returns>

        [WebMethod]

        publicstring GetVersion()

        {

            returnConfigurationManager.ConnectionStrings["version"].ConnectionString;

        }

        /// <summary>

        /// 获取下载地址

        /// </summary>

        /// <returns>下载地址</returns>

        [WebMethod]

        publicstring GetUrl()

        {

            returnConfigurationManager.ConnectionStrings["url"].ConnectionString + ConfigurationManager.ConnectionStrings["directory"].ConnectionString + "/";

        }

        /// <summary>

        /// 获取下载zip压缩包

        /// </summary>

        /// <returns>下载zip压缩包</returns>

        [WebMethod]

        publicstring[] GetZips()

        {

            string folder = HttpRuntime.AppDomainAppPath + ConfigurationManager.ConnectionStrings["directory"].ConnectionString;

            string[] zips = Directory.GetFileSystemEntries(folder);

            for (int i = 0; i < zips.Length; i++)

            {

                zips[i] = Path.GetFileName(zips[i]);

            }

            return zips;

        }

    }

  • 相关阅读:
    [NOIP2011]选择客栈
    [学习笔记]字符串的一些基本操作
    [学习笔记]树链剖分
    [宁波集训]0827Day1
    [POI2015]LOG(树状数组)
    [学习笔记]树形dp
    货车运输(最大生成树+倍增LCA)
    POJ 3617 Best Cow Line 贪心算法
    C++ STL next_permutation() prev_permutation(a,a+n)用法。
    POJ 2386 Lake Counting dfs
  • 原文地址:https://www.cnblogs.com/yelanggu/p/6972860.html
Copyright © 2011-2022 走看看