C#更新升级Win客户端说明及代码.doc_第1页
C#更新升级Win客户端说明及代码.doc_第2页
C#更新升级Win客户端说明及代码.doc_第3页
C#更新升级Win客户端说明及代码.doc_第4页
C#更新升级Win客户端说明及代码.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#开发的Windows Form 应用程序的升级说明1.在服务器段创建一个可共享的文件夹,或者在服务器的IIS(Internet信息服务)中建立一个可供下载更新文件的目录。如服务端中的 E:UpGrade2.在服务器端(如E:UpGrade)中创建一个xml文件update.xml,该update.xml的内容如下: 23UpGrade HrManager.exe 其中:AppName节点存放应用程序名 AppVersion节点存在最新程序的版本号(服务器版本号) Files节点中的File指的是需要更新的文件名3.服务器端E:UpGrade的内容(如下图):update.xml中主要设置应用程序名、最新程序的版本号、所有需要更新的文件名。详情见上面的update.xml内容。 hrBll.dll、HrManager.exe、hrModel.dll等文件(注意:不包含update.xml)就是需要在客户端更新的文件。(客户端如果不存在这些文件,就添加这些文件;客户端如果存在这些文件,就用服务端的这些文件覆盖掉)4.在客户端的应用程序目录下,增加两个文件:Update.exe和update.xml其中客户端的update.xml的详细内容如下: 23UpGrade HrManager.exe 其中:Url节点 存放 服务端的下载地址(即:更新文件的下载地址) AppName节点存放应用程序名 AppVersion存放本地客户端的版本号5.升级条件:【服务端的update.xml的AppVersion的版本号】 与 【客户端的update.xml的AppVersion的版本号】不同,就升级。客户端升级完成后,将【客户端的update.xml的AppVersion的版本号】修改为服务端的版本号。6.客户端的Update.exe文件是由WinForm应用程序生成。来源:在Visual Studio 2005(或以上版本均可)新建项目Windows窗体应用程序命名为Update,删除默认的Form1窗体,并添加Windows窗体FrmUpdate。在窗体FrmUpdate中加入是哪个控件:Button: btnUpdate 、ProgressBar:progressBar1 、RichTextBox: rchtxtInfo窗体如下图:FrmUpdate的详细代码如下(按钮btnUpdate 的 click事件-btnUpdate_Click)源代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Xml;using System.IO;using System.Net;using System.Diagnostics;namespace Update public partial class FrmUpdate : Form public FrmUpdate() InitializeComponent(); progressBar1.Visible = false;/进度条控件隐藏 / / 按钮更新的Click事件 / / / private void btnUpdate_Click(object sender, EventArgs e) string appName = GetAppName();/应用程序进程名 KillAppProcess(appName);/如果应用程序正在运行,则强行关闭 FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = 请选择程序所在的目录; fbd.SelectedPath = AppDomain.CurrentDomain.BaseDirectory;/E:Hr; if (fbd.ShowDialog() = DialogResult.OK) /查看选择的目录是否含有HrManager.exe if (!File.Exists(fbd.SelectedPath + + appName) MessageBox.Show(目录错误请选择应用程序所在的目录, 提示); return; /获?得?服t务?器目?录? 或者? 服t务?器下?载?地?址, /如?:o23UpGrade string url = GetUrl(); if (!Directory.Exists(url) /查看本?机客户端?能否?连?接服t务?器目?录? MessageBox.Show(无法连接到服务器., 提示); return; /服务器的update.xml与客户端的update.xml 比较版本号是否一致? string serverVersion = GetServerVersion(url); string clientVersion = GetClientVersion(fbd.SelectedPath); rchtxtInfo.Text = 服务器版本: + serverVersion + n客户端版本: + clientVersion + n; Application.DoEvents(); if (serverVersion = clientVersion) rchtxtInfo.Text = rchtxtInfo.Text + 已经是最新版本,不需要更新.n; Application.DoEvents(); return; else rchtxtInfo.Text = rchtxtInfo.Text + 不是最新版本,开始更新.n; Application.DoEvents(); /本?地?版?本?与?服t务?器版?本?不?一?致? 需要a更新? this.Cursor = Cursors.WaitCursor; progressBar1.Visible = true;/滚?动条?显?示? List list = GetUpdateFiles(url); for (int i = 0; i list.Count; i+) if (DownUpdateFile(url + listi, fbd.SelectedPath + + listi) = false) rchtxtInfo.Text = rchtxtInfo.Text + 更新中出现错误.; this.Cursor = Cursors.Default; return; rchtxtInfo.Text = rchtxtInfo.Text + 全部更新已完成.n; /更新?本?地?客户端?下?的?update.xml的?版?本?号?,?与?服t务?端?版?本?号?一?致? UpdateLocalXml(fbd.SelectedPath + update.xml, serverVersion); progressBar1.Visible = false;/滚?动条?隐t藏? rchtxtInfo.Text = rchtxtInfo.Text + 更新成功.; this.Cursor = Cursors.Default; / / 更新?本?地?的?配?置?文?件t的?版?本?号?,使1版?本?号?与?服t务?器版?本?一?致?,这a样下?次?就不?必?更新?了? / / 本?地?xml的?完全?路径? / 服t务?器版?本?号? private void UpdateLocalXml(string xmlFile, string version) XmlDocument doc = new XmlDocument(); doc.Load(xmlFile); XmlNode rootNode = doc.DocumentElement; for (int i = 0; i rootNode.ChildNodes.Count; i+) if (rootNode.ChildNodesi.Name = Application) rootNode.ChildNodesi.ChildNodes1.InnerText = version; break; doc.Save(xmlFile);/保存?文?件t才?可以?更新? / / 如?果?应|用?程序正y在运?行D,?则强?行D关?闭?。然?后才?能更新? / / private void KillAppProcess(string appName) Process allProcess = Process.GetProcesses(); foreach (Process p in allProcess) /MessageBox.Show(p.ProcessName);/进?程名?称?没?有D.exe if (p.ProcessName.ToLower() + .exe = appName.ToLower() for (int i = 0; i p.Threads.Count; i+) p.Threadsi.Dispose(); p.Kill(); / / 获?得?服t务?器下?载?地?址 / / private string GetUrl() XmlDocument doc = new XmlDocument(); doc.Load(AppDomain.CurrentDomain.BaseDirectory + update.xml); XmlNode rootNode = doc.DocumentElement; return rootNode.ChildNodes0.InnerText; / / 通过xml文?件t获?得?应|用?程序名? / / private string GetAppName() XmlDocument doc = new XmlDocument(); doc.Load(AppDomain.CurrentDomain.BaseDirectory + update.xml); XmlNode rootNode = doc.DocumentElement; for (int i = 0; i rootNode.ChildNodes.Count; i+) if (rootNode.ChildNodesi.Name = Application) return rootNode.ChildNodesi.ChildNodes0.InnerText; return ; / / 获?得?服t务?器版?本?号? 当版?本?升y级?时,请?更新?版?本?号? / / 服t务?器的?目?录? / private string GetServerVersion(string serverUrl) XmlDocument doc = new XmlDocument(); doc.Load(serverUrl + update.xml); XmlNode rootNode = doc.DocumentElement; for (int i = 0; i rootNode.ChildNodes.Count; i+) if (rootNode.ChildNodesi.Name = Application) return rootNode.ChildNodesi.ChildNodes1.InnerText; return ; / / 获?得?客户端?版?本?号? / / 客户端?所安2装的?目?录? / private string GetClientVersion(string directoryPath) XmlDocument doc = new XmlDocument(); doc.Load(directoryPath + update.xml); XmlNode rootNode = doc.DocumentElement; for (int i = 0; i rootNode.ChildNodes.Count; i+) if (rootNode.ChildNodesi.Name = Application) return rootNode.ChildNodesi.ChildNodes1.InnerText; return ; / / 从服t务?器中D获?取?更新?文?件t列D表 / 从服务器目录下的update.xml文件来获取=update.xml的Files节点就是?需要a更新?的?内容Y / / 服t务?器目?录? / private List GetUpdateFiles(string serverUrl) List list = new List(); XmlDocument doc = new XmlDocument(); doc.Load(serverUrl + update.xml); XmlNode rootNode = doc.DocumentElement; for (int i = 0; i rootNode.ChildNodes.Count; i+) if (rootNode.ChildNodesi.Name = Files) /找到?Files节点? for (int j = 0; j rootNode.ChildNodesi.ChildNodes.Count; j+) /找出?节点?的?Name属?性? XmlAttribute attr = rootNode.ChildNodesi.ChildNodesj.AttributesName; list.Add(attr.Value); break; return list; / / 下?载?并更新?文?件t(本?地?客户端?存?在文?件t 就用?服t务?器文?件t覆2盖?掉?,不?存?在该?文?件t就创建并写入?) / / 服t务?器文?件t全?名? / 本?地?文?件t全?名? / private bool DownUpdateFile(string serverFullName, string localFullName) try WebClient wcClient = new WebClient(); /服t务?器文?件t全?名?:url + listi WebRequest webReq = WebRequest.Create(serverFullName); WebResponse webRes = webReq.GetResponse(); long fileLength = webRes.ContentLength; string fileName = Path.GetFileName(serverFullName); rchtxtInfo.Text = rchtxtInfo.Text + string.Format(正在下载更新文件:0,文件大小:1KBn, fileName, (fileLength / 1024.0).ToString(N2); progressBar1.Maximum = (int)fileLength; progressBar1.Value = 0; Application.DoEvents(); Stream stream = webRes.GetResponseStream(); StreamReader sr = new StreamReader(stream); byte bufferbyte = new bytefileLength; int allByte = (int)bufferbyte.Length; int startByte = 0; while (fileLength 0) int downByte = stream.Read(bufferbyte, startByte, allByte); if (downByte = 0) break; startByte = startByte + downByte; allByte = allByte - downByte; progressBar1.Value = startByte; /即:progressBar1.Value = progressBar1.Value + downByte; /本?地?文?件t存?在则覆2盖?,不?存?在则创建 /string localFile = fbd.SelectedPath +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论