using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Web.Script.Serialization; using System.Windows.Forms; using System.Xml; namespace VersionUpdate { public class UpdateClass { public string Name { get; set; } public string Url { get; set; } public string Version { get; set; } public List Message { get; set; } } public class Client { public delegate void DownLoadSuccessDelegate(List updateList); /// /// 更新用户信息事件 /// public static DownLoadSuccessDelegate DownLoadSuccessEvent; public static void OnDownLoadSuccessEvent(List updateList) { if (DownLoadSuccessEvent != null) { DownLoadSuccessEvent?.Invoke(updateList); } } static string Path = System.IO.Directory.GetCurrentDirectory(); static string XMLPath = string.Empty; static Client() { //VersionUpdate //OnlineUpdate //LevelUpdate XMLPath = Path + "\\VersionUpdate.xml"; if (!File.Exists(XMLPath)) { var old_path = Path + "\\OnlineUpdate.xml"; if (!File.Exists(old_path)) throw new Exception("丢失【VersionUpdate.xml】更新包文件!"); else { if (File.Exists(Path + "\\OnlineUpdate.exe")) { try { File.Delete(Path + "\\OnlineUpdate.exe"); } catch (Exception) { } } File.Move(old_path, XMLPath); } } } #region XmlDocument读取 //public List GetVersions() //{ // List msgs = new List(); // XmlDocument XmlDoc = new XmlDocument(); // if (!File.Exists(XMLPath)) throw new Exception("找不到VersionUpdate.xml必备文件!"); // //使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件. // XmlReaderSettings settings = new XmlReaderSettings(); // settings.IgnoreComments = true;//忽略文档里面的注释 // using (XmlReader reader = XmlReader.Create(XMLPath, settings)) // { // XmlDoc.Load(reader); // XmlNode xn = XmlDoc.SelectSingleNode("Files"); // // 得到根节点的所有子节点 // XmlNodeList xnl = xn.ChildNodes; // foreach (XmlNode node in xnl) // { // try // { // //更新文件的别名 // var Name = node.Attributes["Name"].Value; // //之前的配置文件地址 // var Url = node.Attributes["Url"].Value; // var zipNameReg = Regex.Match(Url, @"([^/]+).xml"); // //文件名称 // var zipName = string.Empty; // if (zipNameReg.Success) // zipName = zipNameReg.Groups[1].Value; // //版本号 // var CurVersion = Version.Parse(node.Attributes["Version"].Value); // //XmlDocument temp_xml = new XmlDocument(); // //temp_xml.Load(Url); // //var temp_node = temp_xml.SelectSingleNode("History"); // //var temp_datas = temp_node.SelectNodes("Data"); // ////更新内容 // //List temp_update = new List(); // //foreach (XmlNode item in temp_datas) // //{ // // var ver = Version.Parse(item.Attributes["Ver"].Value); // // if (ver > CurVersion) // // { // // //发现有更新 // // temp_update.Add(item); // // } // //} // var result = HttpPost(zipName, ""); // //解析web返回的json消息 // //{"code":0,"data":{"Id":23,"key":23,"Active":true,"SoftName":"MainUpdate","Version":"2021.02.26.2","VersionLong":2021000200260002,"DownUrl":"http://fr-1303123972.cos.ap-chengdu.myqcloud.com/504e4621-0134-621d-b810-d30c0e41abca.zip","Message":"4444444555555666666666666","CreteTime":"\/Date(1614312406000)\/","CreateStr":"2021-02-26 12:06:46"}} // if (!string.IsNullOrWhiteSpace(result)) // { // var ver = string.Empty; // var downUrl = string.Empty; // var updateMesss = new List(); // JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); // var dicResult = javaScriptSerializer.Deserialize>(result); // if (dicResult != null) // { // if (dicResult["code"].ToString() != "0") throw new Exception("连接服务器失败,请稍后重试!"); // var data = dicResult["data"] as Dictionary; // if (data != null) // { // if ((bool)data["Active"]) // { // if (string.IsNullOrWhiteSpace(ver)) // ver = data["Version"].ToString(); // if (string.IsNullOrWhiteSpace(downUrl)) // downUrl = data["DownUrl"].ToString(); // var temps = data["Message"].ToString().Split(new string[] { "[br]" }, StringSplitOptions.None); // foreach (var temp in temps) updateMesss.Add(temp); // } // var MSG = new UpdateClass() { Name = Name, Url = downUrl, Message = updateMesss, Version = ver }; // msgs.Add(MSG); // } // } // } // //if (temp_update.Count > 0) // //{ // // var MSG = new UpdateClass() { Name = Name, Url = temp_update[0].Attributes["Url"].Value, Message = new List(), Version = temp_update[0].Attributes["Ver"].Value }; // // msgs.Add(MSG); // // foreach (var item in temp_update) // // { // // var temps = item.Attributes["Msg"].Value.Split(new string[] { "[br]" }, StringSplitOptions.None); // // foreach (var temp in temps) MSG.Message.Add(temp); // // } // //} // } // catch (Exception) // { // } // #region xxx // //try // //{ // // var Name = node.Attributes["Name"].Value; // // var Url = node.Attributes["Url"].Value; // // var CurVersion = Version.Parse(node.Attributes["Version"].Value); // // XmlDocument temp_xml = new XmlDocument(); // // temp_xml.Load(Url); // // var temp_node = temp_xml.SelectSingleNode("History"); // // var temp_datas = temp_node.SelectNodes("Data"); // // //更新内容 // // List temp_update = new List(); // // foreach (XmlNode item in temp_datas) // // { // // var ver = Version.Parse(item.Attributes["Ver"].Value); // // if (ver > CurVersion) // // { // // //发现有更新 // // temp_update.Add(item); // // } // // } // // if (temp_update.Count > 0) // // { // // var MSG = new UpdateClass() { Name = Name, Url = temp_update[0].Attributes["Url"].Value, Message = new List(), Version = temp_update[0].Attributes["Ver"].Value }; // // msgs.Add(MSG); // // foreach (var item in temp_update) // // { // // var temps = item.Attributes["Msg"].Value.Split(new string[] { "[br]" }, StringSplitOptions.None); // // foreach (var temp in temps) MSG.Message.Add(temp); // // } // // } // //} // //catch (Exception) // //{ // //} // #endregion // } // } // return msgs; //} public List GetVersions() { List msgs = new List(); XmlDocument XmlDoc = new XmlDocument(); if (!File.Exists(XMLPath)) throw new Exception("找不到VersionUpdate.xml必备文件!"); //使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件. XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true;//忽略文档里面的注释 using (XmlReader reader = XmlReader.Create(XMLPath, settings)) { XmlDoc.Load(reader); XmlNode xn = XmlDoc.SelectSingleNode("Files"); // 得到根节点的所有子节点 XmlNodeList xnl = xn.ChildNodes; foreach (XmlNode node in xnl) { try { var Name = node.Attributes["Name"].Value; var Url = node.Attributes["Url"].Value; var CurVersion = Version.Parse(node.Attributes["Version"].Value); XmlDocument temp_xml = new XmlDocument(); temp_xml.Load(Url); var temp_node = temp_xml.SelectSingleNode("History"); var temp_datas = temp_node.SelectNodes("Data"); //更新内容 List temp_update = new List(); foreach (XmlNode item in temp_datas) { var ver = Version.Parse(item.Attributes["Ver"].Value); if (ver > CurVersion) { //发现有更新 temp_update.Add(item); } } if (temp_update.Count > 0) { var MSG = new UpdateClass() { Name = Name, Url = temp_update[0].Attributes["Url"].Value, Message = new List(), Version = temp_update[0].Attributes["Ver"].Value }; msgs.Add(MSG); foreach (var item in temp_update) { var temps = item.Attributes["Msg"].Value.Split(new string[] { "[br]" }, StringSplitOptions.None); foreach (var temp in temps) MSG.Message.Add(temp); } } } catch (Exception) { } } } return msgs; } //private string HttpPost(string softname, string version) //{ // string content = $"SoftName={softname}"; // string url = "http://106.52.154.242:82/soft/GetLast?{content}"; // try // { // //获取提交的字节 // byte[] bs = Encoding.UTF8.GetBytes(content); // //设置提交的相关参数 // HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); // req.Method = "POST"; // req.ContentType = "application/x-www-form-urlencoded"; // req.ContentLength = bs.Length; // //提交请求数据 // Stream reqStream = req.GetRequestStream(); // reqStream.Write(bs, 0, bs.Length); // reqStream.Close(); // //接收返回的页面,必须的,不能省略 // WebResponse wr = req.GetResponse(); // System.IO.Stream respStream = wr.GetResponseStream(); // System.IO.StreamReader reader = new System.IO.StreamReader(respStream, System.Text.Encoding.GetEncoding("utf-8")); // string t = reader.ReadToEnd(); // Console.WriteLine(t); // wr.Close(); // return t; // } // catch (Exception ex) // { // System.Web.HttpContext.Current.Response.Write("异常在getPostRespone:" + ex.Source + ":" + ex.Message); // } // return string.Empty; //} public delegate void NeedRestupdate(); public static NeedRestupdate NeedRestupdateEvent; internal void DownFile(List update_msg, ProgressBar prog, Label label) { int i = 1; foreach (var item in update_msg) { label?.Invoke(new Action(delegate { label.Text = $"正在下载第{i}个文件的更新包...(共{update_msg.Count}个)"; })); DownloadFile(item.Url, MapFile($"{item.Name}_{item.Version}.zip", "Cache\\VersionUpdate"), prog); i++; } label?.Invoke(new Action(delegate { label.Text = $"下载完成,请重启安装!"; })); NeedRestupdateEvent?.BeginInvoke(null, null); } /// /// 检查是否有需要安装的程序 /// public bool CheckInstall() { var files = GetInstallFiles(); if (files.Count > 0) { new InstallFileForm(files, this).ShowDialog(); return true; } return false; } public static bool StartProcess(string filename, string param = null) { try { if (!File.Exists(filename)) return false; try { if (!System.IO.File.Exists(filename)) return false; if (param != null) System.Diagnostics.Process.Start(filename, param); else System.Diagnostics.Process.Start(filename); System.Threading.Thread.Sleep(100); } catch (Exception) { // MessageBox.Show("启动应用程序时出错!原因:" + ex.Message); } return false; } catch (Exception) { // MessageBox.Show("启动应用程序时出错!原因:" + ex.Message); } return false; } /// /// 检查是否有新版本 /// public bool CheckVersion() { var ves = GetVersions(); if (ves.Count > 0) { var f = new DownloadForm(ves, this); f.ShowDialog(); return f.IsOk; } return false; } public bool DownloadFile(List updateList) { if (updateList.Count > 0) { var f = new DownloadForm(updateList, this); f.ShowDialog(); return f.IsOk; } return false; } /// /// 获得需要安装的文件 /// /// public List GetInstallFiles() { var path = MapPath("Cache\\VersionUpdate"); DirectoryInfo dir = new DirectoryInfo(path); var zips = dir.GetFiles("*_*.zip", SearchOption.TopDirectoryOnly); var files = new List(); foreach (var item in zips) { var reg = Regex.Match(item.Name, "^(.*?)_(.*?)\\.zip$"); if (reg.Success) { try { var name = item.Name; var version = Version.Parse(reg.Groups[2].Value); files.Add(item); } catch (Exception) { } } } return files; } public void StartInstall() { var name = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName; if (name == "VersionUpdate.exe") return; StartProcess("VersionUpdate.exe", name); } public void InstallFile(FileInfo file) { try { var data = file.Name.Split('_'); var reg = Regex.Match(file.Name, "^(.*?)_(.*?).zip$"); if (!reg.Success) return; Version version = null; if (!Version.TryParse(reg.Groups[2].Value, out version)) return; var name = reg.Groups[1].Value; ZipArchive.UnZip(file.FullName, Path); XmlDocument XmlDoc = new XmlDocument(); XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true;//忽略文档里面的注释 using (XmlReader reader = XmlReader.Create(XMLPath, settings)) { XmlDoc.Load(reader); foreach (XmlNode _temp in XmlDoc.SelectSingleNode("Files").ChildNodes) { if (name == _temp.Attributes["Name"].Value) { _temp.Attributes["Version"].Value = version.ToString(); break; } } } XmlDoc.Save(XMLPath); File.Delete(file.FullName); } catch (Exception ex) { } } public static string MapFile(string file, string path = "") { return System.IO.Path.Combine(MapPath(path, true), file); } public static string MapPath(string path = "", bool CreateDirectory = true) { try { if (string.IsNullOrWhiteSpace(path)) { return System.Windows.Forms.Application.StartupPath.ToString() + "\\"; } path = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath.ToString() + "\\", path); if (!(!CreateDirectory || Directory.Exists(path))) { Directory.CreateDirectory(path); } } catch (Exception) { } return path; } public void DownloadFile(string URL, string filename, ProgressBar prog) { try { float percent = 0; if (File.Exists(filename)) File.Delete(filename); Stream st = null; Stream so = null; System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); long totalBytes = myrp.ContentLength; prog.Invoke(new Action(delegate { prog.Value = 0; prog.Maximum = (int)totalBytes; })); st = myrp.GetResponseStream(); so = new System.IO.FileStream(filename, System.IO.FileMode.Create); try { long totalDownloadedByte = 0; byte[] by = new byte[1024]; int osize = st.Read(by, 0, (int)by.Length); while (osize > 0) { totalDownloadedByte = osize + totalDownloadedByte; Application.DoEvents(); so.Write(by, 0, osize); prog.Invoke(new Action(delegate { prog.Value = (int)totalDownloadedByte; })); osize = st.Read(by, 0, (int)by.Length); percent = (float)totalDownloadedByte / (float)totalBytes * 100; Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息 } } catch (Exception ex) { if (so != null) { so.Close(); so.Dispose(); so = null; } if (st != null) { st.Close(); st.Dispose(); st = null; } throw ex; } finally { if (so != null) { so.Close(); so.Dispose(); so = null; } if (st != null) { st.Close(); st.Dispose(); st = null; } } } catch (Exception ex) { } } #endregion XmlDocument读取 } }