old_flsystem/类库/VersionUpdate/Client.cs

575 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string> Message { get; set; }
}
public class Client
{
public delegate void DownLoadSuccessDelegate(List<UpdateClass> updateList);
/// <summary>
/// 更新用户信息事件
/// </summary>
public static DownLoadSuccessDelegate DownLoadSuccessEvent;
public static void OnDownLoadSuccessEvent(List<UpdateClass> 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<UpdateClass> GetVersions()
//{
// List<UpdateClass> msgs = new List<UpdateClass>();
// 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<XmlNode> temp_update = new List<XmlNode>();
// //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<string>();
// JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
// var dicResult = javaScriptSerializer.Deserialize<Dictionary<string, Object>>(result);
// if (dicResult != null)
// {
// if (dicResult["code"].ToString() != "0") throw new Exception("连接服务器失败,请稍后重试!");
// var data = dicResult["data"] as Dictionary<string, object>;
// 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<string>(), 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<XmlNode> temp_update = new List<XmlNode>();
// // 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<string>(), 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<UpdateClass> GetVersions()
{
List<UpdateClass> msgs = new List<UpdateClass>();
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<XmlNode> temp_update = new List<XmlNode>();
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<string>(), 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<UpdateClass> 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);
}
/// <summary>
/// 检查是否有需要安装的程序
/// </summary>
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;
}
/// <summary>
/// 检查是否有新版本
/// </summary>
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<UpdateClass> updateList)
{
if (updateList.Count > 0)
{
var f = new DownloadForm(updateList, this);
f.ShowDialog();
return f.IsOk;
}
return false;
}
/// <summary>
/// 获得需要安装的文件
/// </summary>
/// <returns></returns>
public List<FileInfo> GetInstallFiles()
{
var path = MapPath("Cache\\VersionUpdate");
DirectoryInfo dir = new DirectoryInfo(path);
var zips = dir.GetFiles("*_*.zip", SearchOption.TopDirectoryOnly);
var files = new List<FileInfo>();
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读取
}
}