You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
10 KiB
261 lines
10 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Net;
|
|
using System.IO;
|
|
using System.Xml;
|
|
using ConUpdate.ViewModel;
|
|
using System.Configuration;
|
|
|
|
namespace ConUpdate
|
|
{
|
|
class CommonMethod
|
|
{
|
|
private LogHelper log = new LogHelper();
|
|
/// <summary>
|
|
/// 是否需要更新
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<XmlNodeItem> IsUpdate(out string currentVersion)
|
|
{
|
|
List<XmlNodeItem> updateList = new List<XmlNodeItem>();
|
|
try
|
|
{
|
|
string localPath = Directory.GetCurrentDirectory() + "\\ScreenVersion.txt";
|
|
|
|
FileStream fs = new FileStream(localPath, FileMode.Open);
|
|
using (StreamReader sr = new StreamReader(fs))
|
|
{
|
|
string temp = sr.ReadLine();
|
|
currentVersion = temp.Substring(temp.LastIndexOf("V"));
|
|
}
|
|
fs.Close();
|
|
|
|
log.WriteInfoFile("服务器配置文件地址:" + ConfigurationManager.AppSettings["url"]);
|
|
List<XmlNodeItem> versionList = XmlReader(ConfigurationManager.AppSettings["url"]);
|
|
|
|
foreach (var item in versionList)
|
|
{
|
|
if (currentVersion != item.Title)
|
|
updateList.Add(item);
|
|
else
|
|
break;
|
|
}
|
|
return updateList;
|
|
}
|
|
catch
|
|
{
|
|
currentVersion = "";
|
|
return updateList;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 开始更新
|
|
/// </summary>
|
|
/// <param name="prog"></param>
|
|
public void StartUpdate(XmlNodeItem versionItem, ProgressViewModel viewModel)
|
|
{
|
|
try
|
|
{
|
|
List<string> fileList = GetDirectoryContents(versionItem.Url);
|
|
List<string> copyfile = new List<string>();
|
|
List<string> sourcefile = new List<string>();
|
|
viewModel.Title = "正在更新版本...";
|
|
viewModel.MaxValue = 100;
|
|
viewModel.CurrentProgress = 1;
|
|
viewModel.Val = 0;
|
|
viewModel.Message = viewModel.CurrentProgress + "/" + fileList.Count;
|
|
|
|
for (int i = 0; i < fileList.Count; i++)
|
|
{
|
|
try
|
|
{
|
|
string remoteFile = versionItem.Url + "/" + fileList[i];
|
|
string localFile = Directory.GetCurrentDirectory() + "\\" + fileList[i];
|
|
string dir = localFile.Remove(localFile.LastIndexOf("\\")) + "\\updatetemp";
|
|
|
|
viewModel.CurrentProgress = i + 1;
|
|
viewModel.Message = viewModel.CurrentProgress + "/" + fileList.Count;
|
|
|
|
if (!Directory.Exists(dir))
|
|
Directory.CreateDirectory(dir);
|
|
if (!Directory.Exists(localFile.Remove(localFile.LastIndexOf("\\"))))
|
|
Directory.CreateDirectory(localFile.Remove(localFile.LastIndexOf("\\")));
|
|
if (File.Exists(localFile))
|
|
{
|
|
string tempfile = localFile.Remove(localFile.LastIndexOf("\\")) + "\\updatetemp\\" + fileList[i].Replace("\\", "/").Substring(fileList[i].LastIndexOf("/") + 1, fileList[i].Length - fileList[i].LastIndexOf("/") - 1);
|
|
if (File.Exists(tempfile))
|
|
{
|
|
File.Delete(tempfile);
|
|
}
|
|
log.WriteInfoFile("正在移动:"+localFile);
|
|
File.Move(localFile, tempfile);
|
|
copyfile.Add(tempfile);
|
|
sourcefile.Add(localFile);
|
|
File.Delete(localFile);
|
|
}
|
|
|
|
WebRequest request = WebRequest.Create(remoteFile);
|
|
WebResponse respone = request.GetResponse();
|
|
Stream netStream = respone.GetResponseStream();
|
|
Stream fileStream = new FileStream(localFile, FileMode.Create);
|
|
long totalDownloadedByte = 0;
|
|
byte[] read = new byte[1024];
|
|
int realReadLen = netStream.Read(read, 0, read.Length);
|
|
while (realReadLen > 0)
|
|
{
|
|
totalDownloadedByte = realReadLen + totalDownloadedByte;
|
|
fileStream.Write(read, 0, realReadLen);
|
|
realReadLen = netStream.Read(read, 0, read.Length);
|
|
|
|
viewModel.Val = ((totalDownloadedByte / respone.ContentLength) * 100);
|
|
}
|
|
netStream.Close();
|
|
fileStream.Close();
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
log.WriteInfoFile(ex.ToString());
|
|
for (int j = 0; j < copyfile.Count; j++)
|
|
{
|
|
if (File.Exists(copyfile[j]))
|
|
{
|
|
if (File.Exists(sourcefile[j]))
|
|
{
|
|
File.Delete(sourcefile[j]);
|
|
|
|
}
|
|
File.Move(copyfile[j], sourcefile[j]);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
log.WriteInfoFile("更新完成!" );
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
log.WriteInfoFile(ex.ToString());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取路径下所有文件路径
|
|
/// </summary>
|
|
/// <param name="url"></param>
|
|
/// <param name="deep"></param>
|
|
/// <returns></returns>
|
|
private List<string> GetDirectoryContents(string remotePath)
|
|
{
|
|
List<string> fileNames = new List<string>();
|
|
string filePath = remotePath + "/config.txt";
|
|
|
|
WebRequest request = WebRequest.Create(filePath);
|
|
WebResponse respone = request.GetResponse();
|
|
|
|
Stream netStream = respone.GetResponseStream();
|
|
StreamReader sr = new StreamReader(netStream, Encoding.UTF8);
|
|
string lineStr = sr.ReadLine();
|
|
while (!string.IsNullOrEmpty(lineStr))
|
|
{
|
|
fileNames.Add(lineStr.Replace("\0", ""));
|
|
lineStr = sr.ReadLine();
|
|
}
|
|
|
|
netStream.Close();
|
|
sr.Close();
|
|
|
|
//Stream fs = new FileStream(localPath, FileMode.Create);
|
|
|
|
//int readBytes = netStream.Read(buffer, 0, buffer.Length);
|
|
//while (readBytes > 0)
|
|
//{
|
|
// fs.Write(buffer, 0, buffer.Length);
|
|
// readBytes = netStream.Read(buffer, 0, buffer.Length);
|
|
//}
|
|
//netStream.Close();
|
|
//fs.Close();
|
|
|
|
//if (File.Exists(localPath))
|
|
//{
|
|
// string[] names = File.ReadAllLines(localPath, Encoding.UTF8);
|
|
// foreach (var item in names)
|
|
// fileNames.Add(item.Replace("\0", ""));
|
|
//}
|
|
|
|
return fileNames;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 读取xml文件
|
|
/// </summary>
|
|
/// <param name="url"></param>
|
|
/// <returns></returns>
|
|
private List<XmlNodeItem> XmlReader(string url)
|
|
{
|
|
|
|
List<XmlNodeItem> nodeList = new List<XmlNodeItem>();
|
|
try
|
|
{
|
|
XmlDocument doc = new XmlDocument();
|
|
doc.Load(url); //加载Xml文件
|
|
XmlElement rootElem = doc.DocumentElement; //获取根节点
|
|
XmlNodeList itemNodes = rootElem.GetElementsByTagName("item"); //获取item子节点集合
|
|
foreach (XmlNode node in itemNodes)
|
|
{
|
|
XmlNodeItem item = new XmlNodeItem();
|
|
XmlNodeList subTitleNodes = ((XmlElement)node).GetElementsByTagName("title"); //获取title子XmlElement集合
|
|
XmlNodeList subDateNodes = ((XmlElement)node).GetElementsByTagName("date"); //获取date子XmlElement集合
|
|
XmlNodeList subUrlNodes = ((XmlElement)node).GetElementsByTagName("url"); //获取url子XmlElement集合
|
|
XmlNodeList subConfigNodes = ((XmlElement)node).GetElementsByTagName("iscopyconfig"); //获取iscopyconfig子XmlElement集合
|
|
XmlNodeList subDescribtionNodes = ((XmlElement)node).GetElementsByTagName("describtion"); //获取describtion子XmlElement集合
|
|
if (subTitleNodes.Count == 1)
|
|
item.Title = subTitleNodes[0].InnerText;
|
|
if (subDateNodes.Count == 1)
|
|
item.Date = subDateNodes[0].InnerText;
|
|
if (subUrlNodes.Count == 1)
|
|
item.Url = subUrlNodes[0].InnerText;
|
|
if (subConfigNodes.Count == 1)
|
|
item.IsCopyConfig = subConfigNodes[0].InnerText;
|
|
if (subDescribtionNodes.Count == 1)
|
|
item.Describtion = subDescribtionNodes[0].InnerText;
|
|
|
|
nodeList.Add(item);
|
|
}
|
|
|
|
return nodeList;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.WriteInfoFile(ex.ToString());
|
|
return nodeList;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 比较两个数组是否相等
|
|
/// </summary>
|
|
/// <param name="b1"></param>
|
|
/// <param name="b2"></param>
|
|
/// <returns></returns>
|
|
private int CompareBytes(byte[] b1, byte[] b2)
|
|
{
|
|
if (b1 == null || b2 == null)
|
|
return -1;
|
|
if (b1.Length != b2.Length)
|
|
return -1;
|
|
else
|
|
{
|
|
for (int i = 0; i < b1.Length; i++)
|
|
{
|
|
if (b1[i] != b2[i])
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|