自动更新

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

        }


    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值