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

根本实现: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 = ;
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();
return;
}
this.downWebClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
this.downWebClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
if (this.allsize == 0L || files == null || files.Count == )
{
this.UpdateCompleted();
}
if (files != null && files.Count > )
{
DownloadFile();
} }

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 =
};
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.本地update.xml

2.网站server.xml

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

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

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

  1. nw.js桌面程序自动更新(node.js表白记)

    Hello Google Node.js 一个基于Google V8 的JavaScript引擎. 一个伟大的端至端语言,或许我对你的热爱源自于web这门极富情感的技术吧! 注: 光阴似水,人生若梦, ...

  2. .Net桌面程序自动更新NAppUpdate

    自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...

  3. Python编写的桌面图形界面程序实现更新检测和下载安装

    在Python中我们有很多种方案来编写桌面图形用户界面程序,譬如内置的 Tkinter .强大的 PyQt5 和 PySide2 ,还有 wxPython .借助这些或内置或第三方的模块,我们可以轻松 ...

  4. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

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

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  6. <转>exe & dll自我更新

    exe & dll自我更新 分类: c/c++ 2008-10-16 22:07 756人阅读 评论(1) 收藏 举报 exedlldelayapi游戏 exe与dll的自我更新     在改 ...

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

    首发:个人博客,更新&纠错&回复 在昨天的dota契合度计算器中,用到了dota英雄数据和dota玩家数据这两个数据库,为了便于网页应用使用,这两个数据库的存储格式是json,即her ...

  8. HTML5 Web缓存&运用程序缓存&cookie,session

    在介绍HTML5 web缓存前,来认识一下cookie和session: session: 由于HTTP是无状态的,你是谁?你干了什么?抱歉服务器都是不知道的. 因此session(会话)出现了,它会 ...

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

    本文介绍如何在不使用U盘的情况下使用wubi.exe程序在Win7上安装ubuntu-14.04.3版系统. 花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot ...

随机推荐

  1. C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)

    3.空指针(nullptr) 早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分. C 使用 preprocessor macroNULL 表示空指针, 让 NULL 及 0 分别 ...

  2. Android中使用findViewByMe提升组件查找效率

    1.引出 安卓初学者一般在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载layout,通过findViewById来实现控件的绑定,刚 ...

  3. [PKU2389]Bull Math (大数运算)

    Description Bulls are so much better at math than the cows. They can multiply huge integers together ...

  4. html基础知识1(基本标签)2017-03-07

    摘要:php基础知识1 内容:大学中虽有接触,却是以学生的心态去应付考试的,学的都是理论知识:从今天开始我同样还是要以学生的心态去学习,但却要以要从事工作的心态去练习. 以下为第一天所学内容,因电脑原 ...

  5. 关于JAVA中抽象类和接口的区别辨析

    今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...

  6. 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 426[Submit][Statu ...

  7. 从Hash Killer I、II、III论字符串哈希

    首先,Hash Killer I.II.III是BZOJ上面三道很经典的字符串哈希破解题.当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机 ...

  8. Bzoj超级经验大放送题集(好评如潮哦~~~)

    其实这些是因为没有数据才形成的...唯一可惜的是这些都是需要300软妹币才能打开的萌萌哒权限题*^_^* 好啦,吾来教你如何快速AC么么哒 pascal: 1 begin end. //Pascal ...

  9. android开发艺术探索读书笔记之-------view的事件分发机制

    View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...

  10. web从入门开始(1)------简介

    服务端与客户端 HTML简介