373 lines
13 KiB
C#
373 lines
13 KiB
C#
using OnlineRepair;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
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
|
||
{
|
||
|
||
static string Path = System.IO.Directory.GetCurrentDirectory();
|
||
static string XMLPath = string.Empty;
|
||
|
||
static Client()
|
||
{
|
||
XMLPath = Path + "\\VersionUpdate.xml";
|
||
if (!File.Exists(XMLPath))
|
||
{
|
||
var old_path = Path + "\\LevelUpdate.xml";
|
||
if (!File.Exists(old_path)) throw new Exception("丢失【VersionUpdate.xml】更新包文件!");
|
||
else
|
||
{
|
||
if (File.Exists(Path + "\\LevelUpdate.exe"))
|
||
{
|
||
try
|
||
{
|
||
File.Delete(Path + "\\LevelUpdate.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("找不到LevelUpdate.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;
|
||
}
|
||
|
||
|
||
|
||
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)
|
||
{
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion XmlDocument读取
|
||
}
|
||
}
|