using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;
using System.Diagnostics;
namespace Chareree.Utils.Update
{
/*
*更新原理
*下载更新server.XML文件到本地临时目录
* 和本地local.xml文件做对比
* 先判断最后一次更新时间,如果最后一次更新时间比local大,则更新
* 再判断文件的版本号,如果没有版本号则使用修改日期。
* 下载更新的文件到临时目录
* 杀死程序,复制替换更新的文件。
* 重新启动主程序
*
* Create Date 2012-11-20
* Author By Chareree
*/
public class UpdateHelper
{
/// <summary>
/// 主目录名
/// </summary>
public static readonly string tempAppName = "AutoUpdate-Soft-V1.0";
/// <summary>
/// 临时目录
/// </summary>
public static string tempserver_Path = Path.Combine(Environment.GetEnvironmentVariable("Temp"), tempAppName);
/// <summary>
/// 更新URL地址
/// </summary>
public static string url = "";
/// <summary>
/// 委托
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
public delegate void DownPercentHandler(string name, int value);
/// <summary>
/// 下载百分比事件
/// </summary>
public static DownPercentHandler DownPecent;
/// <summary>
/// 检查更新返回List列表UpdateFile集合
/// </summary>
/// <param name="serverXml"></param>
/// <param name="localXml"></param>
/// <returns></returns>
public static List<UpdateFile> CheckUpdate(string serverXml, string localXml)
{
if (!Directory.Exists(tempserver_Path))
Directory.CreateDirectory(tempserver_Path);
下载服务器更新配置文件到本地
DownLoadServerFile(serverXml, tempserver_Path, localXml);
List<UpdateFile> server_List = XmlHelper.getUpdateFileList(tempserver_Path + "\\" + serverXml, "Files/File");
List<UpdateFile> local_List = XmlHelper.getUpdateFileList(localXml, "Files/File");
List<UpdateFile> update_List = new List<UpdateFile>();
foreach (UpdateFile file in server_List)
{
#region 使用LinqToSQL
if (local_List.Contains(file)) //判断是不是包括文件名相同的文件
{
//var fileUpdateInfo = from m in local_List where m.Name == file.Name && ((m.Version != null && m.Version < file.Version) || (m.Version == null && m.LastWriteTime < file.LastWriteTime)) select m;
var fileUpdateInfo = from m in local_List where m.Name == file.Name && (((m.Version != null && m.Version < file.Version) || (m.Version != null && m.Version == file.Version && m.LastWriteTime < file.LastWriteTime)) || (m.Version == null && m.LastWriteTime < file.LastWriteTime)) select m;//(Linq的意思可参考下面if else)
foreach (UpdateFile updatefile in fileUpdateInfo)
{
update_List.Add(new UpdateFile() { FileSize = file.FileSize, LastWriteTime = file.LastWriteTime, Version = file.Version, Name = file.Name });
}
}
else
update_List.Add(new UpdateFile() { FileSize = file.FileSize, LastWriteTime = file.LastWriteTime, Version = file.Version, Name = file.Name });
#endregion
#region 使用循环
/*
if (local_List.Contains(file))
{
foreach (UpdateFile m in local_List)
{
if (m.Name == file.Name) //如果循环中和相比的文件名相同
{
if (m.Version != null)
{
//版本号
if (m.Version < file.Version)
{
update_List.Add(new UpdateFile() { FileSize = file.FileSize, LastWriteTime = file.LastWriteTime, Version = file.Version, Name = file.Name });
}
else if (m.Version == file.Version) //如果版本号相同但是修改时间不同
{
if (m.LastWriteTime < file.LastWriteTime)
{
update_List.Add(new UpdateFile() { FileSize = file.FileSize, LastWriteTime = file.LastWriteTime, Version = file.Version, Name = file.Name });
}
}
}
else //如果没有版本号但是修改时间不同
{
//判断时间
if (m.LastWriteTime < file.LastWriteTime)
{
update_List.Add(new UpdateFile() { FileSize = file.FileSize, LastWriteTime = file.LastWriteTime, Version = file.Version, Name = file.Name });
}
}
}
}
}
else //没有文件名则是新增的,
{
update_List.Add(new UpdateFile() { FileSize = file.FileSize, LastWriteTime = file.LastWriteTime, Version = file.Version, Name = file.Name });
}
*/
#endregion
}
return update_List;
}
/*
* <?xml version="1.0" encoding="utf-8"?>
<UpdateList>
<LastUpdateTime />
<Files>
<File Ver="1.0.0.0" LastWriteTime="2012-11-16 14:22:01" Size="13312">AutoUpdate.exe</File>
<File Ver="" LastWriteTime="2012-11-16 14:22:01" Size="36352">AutoUpdate.pdb</File>
<File Ver="1.0.0.0" LastWriteTime="2012-11-16 14:21:30" Size="11600">AutoUpdate.vshost.exe</File>
<File Ver="" LastWriteTime="2012-10-15 14:59:29" Size="8840">新建文件夹\新建 Microsoft Excel 工作表.xlsx</File>
<File Ver="" LastWriteTime="2012-11-15 14:59:34" Size="22">新建文件夹\新建 WinRAR ZIP 压缩文件.zip</File>
<File Ver="" LastWriteTime="2012-11-15 14:59:53" Size="0">新建文件夹\新建文件夹\新建文本文档.txt</File>
<File Ver="10.0.30319.1" LastWriteTime="2012-10-15 14:58:24" Size="11600">新建文件夹 (2)\AutoUpdate.vshost.exe</File>
<File Ver="" LastWriteTime="2012-11-15 14:42:19" Size="57">新建文件夹 (2)\Update.xml</File>
</Files>
</UpdateList>
*/
/// <summary>
/// 下载更新文件
/// </summary>
/// <param name="serverFileName"></param>
/// <param name="path"></param>
/// <param name="Localfilename"></param>
public static bool DownLoadFile(string serverFileName, string Localfilename)
{
FileStream fileStream = null;
Stream resStream = null;
try
{
if (string.IsNullOrEmpty(tempserver_Path))
{
throw new Exception("tempserver_Path is Null !");
}
string file_path = Path.Combine(tempserver_Path, Localfilename);//path + "\\" + Localfilename;
if (string.IsNullOrEmpty(url)) return false;
String ContactUrl = (serverFileName == string.Empty) ? url : url + "/" + serverFileName;
WebRequest Request = HttpWebRequest.Create(ContactUrl);
Request.Timeout = 8000;
WebResponse Response = Request.GetResponse();
//Localfilename的样式见XML生成文件
string[] str_files = Localfilename.Split('\\');
string tem = "";
for (int i = 0; i < str_files.Length; i++)
{
if (i == str_files.Length - 1) //如果是文件名
{
if (File.Exists(file_path))
File.Delete(file_path);
//创建文件使用流
fileStream = new FileStream(file_path, FileMode.Create);
}
else
//判断是否有目录(XML文件名所定,所以只需创建上一层目录,不用判断上一层目录是否存在)
{
tem += str_files[i] + "\\";
if (!Directory.Exists(Path.Combine(tempserver_Path, tem)))
{
Directory.CreateDirectory(Path.Combine(tempserver_Path, tem));
}
}
}
byte[] bit = new byte[10240];
long total = Response.ContentLength;
if (total < 0)
{
throw new Exception("ContentLength less than zero !");
}
resStream = Response.GetResponseStream();
long read = 0;
long current = 0;
int per = 0;
while ((read = resStream.Read(bit, 0, bit.Length)) > 0)
{
current = (current + read); //总共读取的长度
per = Convert.ToInt32((current * 100) / total);
//Console.WriteLine("current:{0},total:{1},(current*100)/total:{2}", current, total, per);
if (DownPecent != null)
DownPecent(Localfilename, per);
//计算百分比
fileStream.Write(bit, 0, (int)read);//写进读取的长度
fileStream.Flush();
}
return true;
}
catch (Exception ex)
{
if (DownPecent != null)
DownPecent(string.Format("下载{0}文件出错:{1}", Localfilename, ex.Message), 0);
return false;
}
finally
{
if (resStream != null)
resStream.Close();
if (fileStream != null)
fileStream.Close();
}
}
/*
* /// <summary>
/// 下载更新文件
/// </summary>
/// <param name="serverFileName"></param>
/// <param name="path"></param>
/// <param name="Localfilename"></param>
public static void DownLoadFile(string serverFileName, string path, string Localfilename)
{
string file_path = path + "\\" + Localfilename;
try
{
if (string.IsNullOrEmpty(url)) return;
String ContactUrl = (serverFileName == string.Empty) ? url : url + "/" + serverFileName;
WebRequest Request = HttpWebRequest.Create(ContactUrl);
Request.Timeout = 8000;
WebResponse Response = Request.GetResponse();
if (File.Exists(file_path))
File.Delete(file_path);
FileStream fileStream = new FileStream(file_path, FileMode.Create);
byte[] bit = new byte[1024];
int total = Convert.ToInt32(Response.ContentLength);
if (total < 0)
throw new Exception("长度小于0");
Stream resStream = Response.GetResponseStream();
int read = 0;
int current = 0;
int per=0;
while ((read = resStream.Read(bit, 0, bit.Length)) > 0)
{
current = current + read;
per=(current*100)/total;
// Console.WriteLine("current:{0},total:{1},(current*100)/total:{2}", current, total, per);
if (DownPecent != null)
DownPecent(Localfilename, per);
//计算百分比
fileStream.Write(bit, 0, read);
fileStream.Flush();
}
resStream.Close();
fileStream.Close();
}
catch (Exception ex)
{
Console.WriteLine("异常"+ex.Message);
}
}
*/
/// <summary>
/// 下载XML文件
/// </summary>
/// <param name="url">URL</param>
/// <param name="serverFileName">服务器文件名</param>
/// <param name="path">保存的路径</param>
/// <param name="Localfilename">保存的文件名</param>
private static void DownLoadServerFile(string serverFileName, string path, string Localfilename)
{
if (string.IsNullOrEmpty(path))
{
path = Environment.CurrentDirectory;
}
string file_path = Path.Combine(path, Localfilename); //path + @"\" + Localfilename;
Stream resStream = null;
FileStream fileStream = null;
try
{
if (string.IsNullOrEmpty(url))
throw new Exception("URL is Null !");
//合成下载地址
String ContactUrl = (serverFileName == string.Empty) ? url : url + "/" + serverFileName;
WebRequest Request = HttpWebRequest.Create(ContactUrl);
Request.Timeout = 5000;
WebResponse Response = Request.GetResponse();
if (File.Exists(file_path))
File.Delete(file_path);
fileStream = new FileStream(file_path, FileMode.Create);
byte[] bit = new byte[1024];
long TotalLength = Response.ContentLength;
resStream = Response.GetResponseStream();
int read = 0;
while ((read = resStream.Read(bit, 0, bit.Length)) > 0)
{
fileStream.Write(bit, 0, read);
fileStream.Flush();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (resStream != null)
resStream.Close();
if (fileStream != null)
fileStream.Close();
}
}
}
}
自动更新
最新推荐文章于 2023-07-08 22:24:50 发布