代码如下
/*Made by Anby * 2012-11-28 * 实现软件从iis服务器更新版本 * 自动检测当前版本号,从服务器下载 * * * //IIS服务器 增加MIME类型 * .* * application/octet-stream * * * xml文件格式如下: <?xml version="1.0" encoding="utf-8" ?> <UpDateInfo> <Version key="20121125" /> <FileInfo> <FileCount key="6" /> <File1 key="desktop.db" /> <File2 key="SQLite Database Browser.exe" /> <File3 key="System.Data.SQLite.dll" /> <File4 key="桌面提醒插件.exe" /> <File5 key="桌面提醒插件.vshost.exe" /> <File6 key="桌面提醒插件.vshost.exe.manifest" /> </FileInfo> </UpDateInfo> * ini文件格式 [Server] URL=http://192.168.1.200/ //在该目录下存放AutoUpdate.xml文件 [Local] ProcessName=桌面提醒插件 SavePath=D:\Debug\ * 版权所有 */ using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Xml; using System.Net; using System.Collections; using System.DirectoryServices; using System.Diagnostics; using DotNet.Utilities; namespace 程序自动升级 { class Program { static void Main(string[] args) { string Server = GetServerUri(); //远程IIs服务器 string RemotePath = Server+"AutoUpdate.xml"; //远程xml文件地址 string LocalVertion = GetLocalVersion(Path.Combine(System.Environment. CurrentDirectory, @"AutoUpdate.xml"),"Version","key"); //本地版本号 string RemoteVersion = GetRemoteVersion(RemotePath, "/UpDateInfo/Version"); //远程版本号 Console.WriteLine(" 本地版本:" + LocalVertion); Console.WriteLine("服务器端版本:" + RemoteVersion); if (LocalVertion == RemoteVersion) { Console.WriteLine("已经是最新版本,不需要更新!"); } else { string ProcName = GetProcessName() ; string SavePath = GetSavePath(); //关闭要升级的程序 ProcessKill(ProcName); Console.WriteLine(ProcName+"进程结束成功!"); //删除对应的文件 DeleteLocalFiles(SavePath); Console.WriteLine(SavePath+"文件已删除成功!"); //实现文件的下载 int Filecount = int.Parse(GetRemoteVersion(RemotePath, "/UpDateInfo/FileInfo/FileCount")); for (int i = 1; i <= Filecount; i++) { string node = GetRemoteVersion(RemotePath, "/UpDateInfo/FileInfo/File" + i); if (node == "AutoUpdate.xml") //如果文件时更新使用的xml则将本地的xml文件覆盖 DownLoadFile(Server + node,node); //下载更新文件 DownLoadFile(Server + node, SavePath + node); Console.WriteLine(node+"已经下载完成!"); } } Console.WriteLine("更新成功!"); if (OpenFile()) { Console.WriteLine("文件打开成功!"); } else { Console.WriteLine("文件打开失败!"); } Console.Read(); } /// <summary> /// 下载指定uri中的文件 /// </summary> /// <param name="path">要下载文件的uri路径</param> /// <param name="fileName">要保存的文件名及路径,默认文件存放在Application.Startup</param> private static void DownLoadFile(string uri,string fileName) { WebClient WebCnt = new WebClient(); WebCnt.DownloadFile(uri, fileName); } /// <summary> /// 删除本地d:\Debug\中的文件 /// </summary> private static void DeleteLocalFiles(string Path) { DirectoryInfo Dir = new DirectoryInfo(Path); FileInfo[] File = Dir.GetFiles(); //删除本地文件d:\Debug\ foreach (FileInfo item in File) { if (item.Exists) { item.Delete(); } } } /// <summary> /// 读取本地xml的版本信息 /// </summary> /// <param name="path">uri路径:</param> /// <param name="Name">如:"Version"</param> /// <param name="Attribute">如:"key"</param> /// <returns>本地节点的值:version/ key下的值</returns> private static string GetLocalVersion(string path,string Name,string Attribute) { string LastUpdateTime = ""; string AutoUpdaterFileName = path; if (!File.Exists(AutoUpdaterFileName)) return LastUpdateTime;//打开xml文件 FileStream myFile = new FileStream(AutoUpdaterFileName, FileMode.Open); //xml文件阅读器 XmlTextReader xml = new XmlTextReader(myFile); while (xml.Read()) { if (xml.Name == Name) { //获取升级文档的最后一次更新日期 LastUpdateTime = xml.GetAttribute(Attribute); break; } } xml.Close(); myFile.Close(); return LastUpdateTime; } /// <summary> /// 读取远程xml中版本信息 /// </summary> /// <param name="path">远程AutoUpdate.xml的路径如:http://192.168.1.1/AutoUpdate.xml</param> /// <param name="node">键名的路径:如"/UpDateInfo/Version"</param> /// <returns>返回远程xml中/UpDateInfo/Version"的属性值,如:Version键的属性key</returns> private static string GetRemoteVersion(string URL,string node) { string url=URL; //创建一个WebRequest对象对URl请求 WebRequest WebReq = System.Net.WebRequest.Create(url); //创建一个WebResponse对象,用来接收URl资源的返回 WebResponse myResponse = WebReq.GetResponse(); //创建一个文件流,存储返回的数据流 Stream fileStream = myResponse.GetResponseStream(); //创建一个内存中的xml文件 XmlDocument xml = new XmlDocument(); //用虚拟文件来装载文件流 xml.Load(fileStream); //获取节点值 string result = xml.SelectSingleNode(node).Attributes[0].Value.ToString(); return result; } /// <summary> /// 结束进程 /// </summary> /// <param name="processname">进程名</param> /// <returns>成功返回true,否则返回true</returns> private static bool ProcessKill(string processname) { Process[] ProList = Process.GetProcesses(); foreach (Process item in ProList) { if (item.ProcessName == processname) { item.Kill(); return true; } } return false; } private static string GetServerUri() { INIFile inif = new INIFile(Environment.CurrentDirectory + "\\Config.ini"); FileInfo fileinf=new FileInfo(Environment.CurrentDirectory + "\\Config.ini"); if (fileinf.Exists) { inif.IniWriteValue("Server","URL",@"http://192.168.1.200/"); } string result= inif.IniReadValue("Server","URL"); return result; } private static string GetSavePath() { INIFile inif = new INIFile(Environment.CurrentDirectory + "\\Config.ini"); FileInfo fileinf=new FileInfo(Environment.CurrentDirectory + "\\Config.ini"); if (fileinf.Exists) { inif.IniWriteValue("Local","SavePath",@"D:\Debug\"); } string result = inif.IniReadValue("Local", "SavePath"); return result; } private static string GetProcessName() { INIFile inif = new INIFile(Environment.CurrentDirectory + "\\Config.ini"); FileInfo fileinf=new FileInfo(Environment.CurrentDirectory + "\\Config.ini"); if (fileinf.Exists) { inif.IniWriteValue("Local", "ProcessName", "桌面提醒插件"); } string result = inif.IniReadValue("Local", "ProcessName"); return result; } private static bool OpenFile() { Process ps = new Process(); ps.StartInfo.FileName = GetSavePath() + GetProcessName() + ".exe"; if (ps.Start()) { return true; } else { return false; } } } }