通过web对.exe程序进行更新和修改

实现功能:通过网站更新用户的软件,需要联网,也可以通过本地网站更新局域网用户软件。

根本实现:1.一个网站(我用的是自己的www.aq36.xyz ,本地就可以,可以用localhost)然后运行update.exe->{通过update.xml获取网址,然后查看当前版本号和网站的server.xml最高版本号对比。然后判断是否更新}。

2.更新就下载zip文件,解压替换并删除。

3.更新update.xml文档版本信息,跟新结束。

主要代码:

1.解析xml文件:

/// <summary>
        /// 载入并解析XML
        /// </summary>
        private void LoadXml()
        {
            XmlDocument document = new XmlDocument();
            try
            {
                document.Load(updateurl + "Server.xml");
                XmlNode node = document.SelectSingleNode("//updates");

                //获取最新版本号
                version = Convert.ToInt32(node.Attributes["version"].Value);

                //所有需要升级文件大小,文件列表,sql列表
                XmlNodeList updateList = document.SelectNodes("//updates//update");
                foreach (XmlNode n in updateList)
                {
                    long tempVersion = Convert.ToInt32(n.Attributes["version"].Value);
                    long tempSize = Convert.ToInt64(n.Attributes["size"].Value);
                    if (tempVersion > localversion && tempVersion <= version)
                    {
                        allsize += tempSize;
                        versions.Add(tempVersion.ToString());
                        //获取升级文件列表
                        XmlNodeList fileList = n.SelectNodes("//update[@version=‘" + tempVersion + "‘]//files//file");
                        foreach (XmlNode n1 in fileList)
                        {
                            files.Add(n1.InnerText);
                        }
                        //获取执行的SQL语句列表
                        XmlNodeList sqlList = n.SelectNodes("//update[@version=‘" + tempVersion + "‘]//sqls//sql");
                        foreach (XmlNode n2 in sqlList)
                        {
                            sqls.Add(n2.InnerText);
                        }
                        //升级的提示信息
                        XmlNodeList msgList = n.SelectNodes("//update[@version=‘" + tempVersion + "‘]//msg");
                        foreach (XmlNode n3 in msgList)
                        {
                            msg += string.Format(CultureInfo.InvariantCulture, "版本【{0}】 {1}", new object[] { tempVersion, n3.InnerText.Replace("\r\n\t\t", "") }) + "\r\n";
                        }
                    }

                }

            }
            catch (Exception e)
            {
                //Console.WriteLine(e.Message);
                MessageBox.Show("连接升级服务器失败,请重试!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

2.下载文件:

 private void DownloadFile(int index)
        {
            try
            {
                downindex++;
                filename = files[index];
                //LabelNow.Text = "开始下载版本【" + versions[index] + "】" + filename;
                LabelAll.Text = string.Format(CultureInfo.InvariantCulture, "升级进度 {0}/{1}  [ {2} ]", new object[] { downindex, files.Count, this.ConvertSize(allsize) });
                PBNow.Value = 0;
                downWebClient.DownloadFileAsync(new Uri(updateurl + filename), Application.StartupPath + "/temp/" + filename);

            }
            catch (WebException exception)
            {
                MessageBox.Show(exception.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

3.开始升级:

 private void StartUpdate()
        {
            if (localversion >= version)
            {
                UpdateCompleted(0);
                return;
            }
            this.downWebClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
            this.downWebClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
            if (this.allsize == 0L || files == null || files.Count == 0)
            {
                this.UpdateCompleted(0);
            }
            if (files != null && files.Count > 0)
            {
                DownloadFile(0);
            }

        }

4.下载完成并更改update.xml

  private void DownloadFileCompleted(object wcsender, AsyncCompletedEventArgs ex)
        {
            if (ex.Error != null)
            {
                MessageBox.Show(ex.Error.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Hand);
            }
            else
            {
                if (File.Exists(Application.StartupPath + @"\" + this.filename))
                {
                    File.Delete(Application.StartupPath + @"\" + this.filename);
                }
                File.Move(Application.StartupPath + @"\temp\" + this.filename, Application.StartupPath + @"\" + this.filename);
                new FastZip().ExtractZip(Application.StartupPath + @"\" + this.filename, Application.StartupPath + @"\", "");
                File.Delete(Application.StartupPath + @"\" + this.filename);
                this.downedsize += this.filesize;
                if (this.files.Count > this.downindex)
                {
                    this.DownloadFile(this.downindex);
                }
                else
                {
                    XmlTextWriter writer = new XmlTextWriter(Application.StartupPath + @"\update.xml", null)
                    {
                        Formatting = Formatting.Indented,
                        Indentation = 4
                    };
                    writer.WriteStartDocument();
                    writer.WriteStartElement("update");
                    writer.WriteStartElement("ProcessName");
                    writer.WriteString(this.ProcessName);
                    writer.WriteEndElement();
                    writer.WriteStartElement("version");
                    writer.WriteString(this.version.ToString());
                    writer.WriteEndElement();
                    writer.WriteStartElement("url");
                    writer.WriteString(this.updateurl);
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                    writer.WriteEndDocument();
                    writer.Flush();
                    writer.Close();
                    if (!string.IsNullOrEmpty(this.msg))
                    {
                        MessageBox.Show(this.msg, "升级提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }
                    this.UpdateCompleted(1);
                }
            }
        }

跟新进度条效果图:

更新前:

更新后:

一些文档代码图解:

1.本地update.xml

2.网站server.xml

代码粗糙,只是一个简单的demo,简单参考一下,有错误及时联系我。

百度网盘源码加文件:http://pan.baidu.com/s/1qYe2Vgg

时间: 2024-10-07 21:09:18

通过web对.exe程序进行更新和修改的相关文章

使用Advanced Installer为LabVIEW应用(exe)制作升级更新程序(updater)

原文:使用Advanced Installer为LabVIEW应用(exe)制作升级更新程序(updater) 0.前言 上一篇博文:<使用Advanced Installer为LabVIEW生成的exe制作安装程序>讲了弃用LabVIEW自带的安装程序部署,转而使用Advanced Installer来制作安装程序. 本篇博文,我们继续解决LabVIEW制作应用程序的另一个痛点:较难部署升级更新程序.当然,本文所讲内容适用于其他所有Advanced Installer所能支持的安装程序制作类

如何让程序自动更新

如何让程序自动更新 自动更新的软件的目的在于让客户不在为了寻找最新软件花费时间.也不用去到开发商的网站上查找.客户端的软件自动会在程序启动前查找服务器上最新的版本.和自己当前软件的版本比较,如果服务器的是最新版本.客户端则进行自动下载.解压.安装.当然了下载是要有网络的,并且用户可以根据提示去完成操作.再也不用为找不到最新版本的软件而头疼.下面是我的大体思路,已经得到了实现: 1.  写一个webservice,提供一个获取服务器xml中版本的数据的方法.(也可用其他文件格式, 此处举例XML)

IIS8.5 布署 WEB API的程序时,遇到的问题

##IIS7/8 HTTP Error 500.19 错误 0x80070021  IIS7.0/8.0的错误HTTP Error 500.19 - Internal Server Error ,错误代码为0x80070021,大概原因为IIS7.0的安全设定相比前版本有很大的变更.IIS7.0的安全设置文件在%windir%\system32\inetsrv \config\applicationHost.config,这里定义所有Web程序的安全设置,在各个Web程序的web.config可

用Eclipse开发Dynamic Web Project 应用程序

用Eclipse 开发Dynamic Web Project应用程序 (2012-12-04 11:23:08) 标签: 杂谈 分类: web开发 http://blog.csdn.net/blue_fire2008/article/details/7525557 简介:本文仅简单介绍基于Eclipse开发Dynamic Web Project应用下的JSP,Servlet及TOMCAT数据源的配置和开发. 软件环境: Eclipse Java EE IDE for Web Developers

在docker中运行ASP.NET Core Web API应用程序

本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任务,需要准备以下环境: Visual Studio 2015,或者Vi

java调c# exe 程序,exe里写文件问题

应用场景描述: java web程序,触发 调用c#写的后台exe程序,发现exe里写的文件找不到.单独在cmd命令行下执行exe没问题: 问题查找: 由于exe里获取文件路径错误导致: 解决方法: exe中获取程序路径改为: string pathLog = System.Reflection.Assembly.GetExecutingAssembly().Location; pathLog = pathLog.Substring(0, pathLog.LastIndexOf(@"\"

本地json文件的编辑器,node-webkit开发的exe程序

首发:个人博客,更新&纠错&回复 在昨天的dota契合度计算器中,用到了dota英雄数据和dota玩家数据这两个数据库,为了便于网页应用使用,这两个数据库的存储格式是json,即heros.json和players.json这两个文件. json文件的好处是用文本编辑器可以打开,但坏处是不像数据库那样有图形化界面方便操作.英雄有100多个,玩家也有十几个,每个英雄和玩家的属性都有十几二十项,在文本编辑器里拖来拖去太麻烦了,不能一目了然. 而且英雄有个tags属性,这属性实际是用逗号分隔的字

在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统

本文介绍如何在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统. 花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报"cannot download the metalink and therefore the ISO"错误,解决后,又报"没有定义根文件系统",解决后在运行系统之后发现,此种方法会在启动时提示 "为/检查磁盘时发生严重错误 ",并且无法进入系统,折腾了半天,终于

windows下调用外部exe程序 SHELLEXECUTEINFO

本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: 1 typedef struct _SHELLEXECUTEINFO { 2 DWORD cbSize; 3 ULONG fMask; 4 HWND hwnd; 5 LPCTSTR lpVerb; 6 LPCTSTR lpFile; 7 LPCTSTR lpParameters; 8 LPCTSTR lpD