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();
///
/// 是否需要更新
///
///
public List IsUpdate(out string currentVersion)
{
List updateList = new List();
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 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;
}
}
///
/// 开始更新
///
///
public void StartUpdate(XmlNodeItem versionItem, ProgressViewModel viewModel)
{
try
{
List fileList = GetDirectoryContents(versionItem.Url);
List copyfile = new List();
List sourcefile = new List();
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());
}
}
///
/// 获取路径下所有文件路径
///
///
///
///
private List GetDirectoryContents(string remotePath)
{
List fileNames = new List();
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;
}
///
/// 读取xml文件
///
///
///
private List XmlReader(string url)
{
List nodeList = new List();
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;
}
}
///
/// 比较两个数组是否相等
///
///
///
///
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;
}
}
}
}