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; } } } }