zoukankan      html  css  js  c++  java
  • winform 在线升级

    昨天看了别人的在线升级程序代码,然后复制代码实验了下,发现客户端貌似只能下载文件不能下载文件夹,所以简单的修改了下,循环下载文件夹下的文件

    服务器端代码

    <%@ WebHandler Language="C#" Class="UpdateSize" %>
    
    using System; 
    using System.Web; 
    using System.IO;
    
    public class UpdateSize : IHttpHandler { 
        public void ProcessRequest (HttpContext context) 
        {
            len = 0;
            string dirPath = context.Server.MapPath("~/AutoUpdater/"); 
            context.Response.ContentType = "text/xml"; 
            context.Response.Expires = -1; 
            context.Response.Write("<?xml version="1.0" encoding="utf-8" ?>"); 
            context.Response.Write("<UpdateSize Size="" + GetUpdateSize(dirPath) + "" />"); 
            context.Response.End(); 
        }
    
        /// <summary> 
        /// 获取所有下载文件大小 
        /// </summary> 
        /// <returns>返回值</returns> 
        static long len = 0;
        private static long GetUpdateSize(string dirPath) 
        { 
            //判断文件夹是否存在,不存在则退出 
            if (!Directory.Exists(dirPath)) 
                return 0;
            DirectoryInfo di = new DirectoryInfo(dirPath); 
            //获取所有文件大小 
            //foreach (FileInfo fi in di.GetFiles()) 
            foreach (FileSystemInfo fi in di.GetFileSystemInfos()) 
            { 
                //剔除升级数据文件 
                if (fi.Name != "AutoUpdater.xml")
                {
                    GetUpdateSize(fi.FullName);
                    
                    FileInfo f = fi as FileInfo;
                    if (f!=null)
                    {
                        len += f.Length; 
                    }
                }
            }
            return len; 
        }
    
        public bool IsReusable 
        { 
            get 
            { 
                return false; 
            } 
        }
    
    }

    AutoUpdater目录下的AutoUpdater.xml文件代码

    <?xml version="1.0" encoding="utf-8" ?>
    <AutoUpdater>
      <UpdateInfo>
        <!--升级文件的更新日期-->
        <UpdateTime Date = "2008-09-06"/>
      </UpdateInfo>
      <!--升级文件列表-->
     <UpdateFileList>
        <UpdateFile>13.txt</UpdateFile>
      </UpdateFileList>
    <UpdateFileList>
        <UpdateFile>14.txt</UpdateFile>
      </UpdateFileList>
    
      <UpdateFileList>
        <UpdateFile>1.txt</UpdateFile>
      </UpdateFileList>
      <UpdateFileList>
        <UpdateFile>2.txt</UpdateFile>
      </UpdateFileList>
    </AutoUpdater>

    客户端代码

    using System;
    using System.ComponentModel;
    using System.Data;
    using System.Globalization;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml;
    using System.Windows.Forms.Design; 
    
    namespace QWeiXinPrinter
    {
        public partial class AutoUpdater : Form
        {
            private WebClient downWebClient = new WebClient();
            private static string dirPath;
            private static long size;//所有文件大小 
            private static int count;//文件总数 
            private static string[] fileNames;
            private static int num;//已更新文件数 
            private static long upsize;//已更新文件大小 
            private static string fileName;//当前文件名 
            private static long filesize;//当前文件大小 
            public AutoUpdater()
            {
                InitializeComponent();
            }
            private void AutoUpdater_Load(object sender, EventArgs e)
            {
                dirPath = GetConfigValue("conf.config", "Url");
                string thePreUpdateDate = GetTheLastUpdateTime(dirPath);
                string localUpDate = GetConfigValue("conf.config", "UpDate");
                if (!String.IsNullOrEmpty(thePreUpdateDate) && !String.IsNullOrEmpty(localUpDate))
                {
                    if (DateTime.Compare(
                        Convert.ToDateTime(thePreUpdateDate, CultureInfo.InvariantCulture),
                        Convert.ToDateTime(localUpDate, CultureInfo.InvariantCulture)) > 0)
                    {
                        if (Directory.Exists(Application.StartupPath + "\"+"AutoUpdater"))
                        {            
                            Directory.Move(Application.StartupPath + "\" + "AutoUpdater", Application.StartupPath + "\" + "AutoUpdater" + DateTime.Now.Ticks);//备份原先的升级文件
                            Directory.CreateDirectory(Application.StartupPath + "\" + "AutoUpdater");
                        }
                        else
                        {
                            Directory.CreateDirectory(Application.StartupPath + "\" + "AutoUpdater");
                        }
                        UpdaterStart();
                    }
                    else
                    {
                        UpdaterClose();
                    }
                }
                else
                {
                    UpdaterClose();
                }
                //UpdaterStart(); 
            }
    
            /// <summary> 
            /// 开始更新 
            /// </summary> 
            private void UpdaterStart()
            {
                try
                {
                    float tempf;
                    //委托下载数据时事件 
                    this.downWebClient.DownloadProgressChanged += delegate(object wcsender, DownloadProgressChangedEventArgs ex)
                    {
                        this.label2.Text = String.Format(
                            CultureInfo.InvariantCulture,
                            "正在下载:{0}  [ {1}/{2} ]",
                            fileName,
                            ConvertSize(ex.BytesReceived),
                            ConvertSize(ex.TotalBytesToReceive));
                        filesize = ex.TotalBytesToReceive;
                        tempf = ((float)(upsize + ex.BytesReceived) / size);
                        this.progressBar1.Value = Convert.ToInt32(tempf * 100);
                        this.progressBar2.Value = ex.ProgressPercentage;
                    };
                    //委托下载完成时事件 
                    this.downWebClient.DownloadFileCompleted += delegate(object wcsender, AsyncCompletedEventArgs ex)
                    {
                        if (ex.Error != null)
                        {
                            MeBox(ex.Error.Message);
                        }
                        else
                        {//if (File.Exists(Application.StartupPath + "\" + file_path + fileName))
                            //{
                            //    File.Delete(Application.StartupPath + "\" + file_path + fileName);
                            //}
                            if (m_files.Length>1)
                            {
                                if (!Directory.Exists(Application.StartupPath + "\" + file_path))
                                {
                                    Directory.CreateDirectory(Application.StartupPath + "\" + file_path);
                                }
                            }
                           
                            File.Copy(loc_path + file_path+fileName, Application.StartupPath + "\" + file_path+fileName,true);
                            upsize += filesize;
                            if (fileNames.Length > num)
                            {
                                DownloadFile(num);
                            }
                            else
                            {
                                SetConfigValue("conf.config", "UpDate", GetTheLastUpdateTime(dirPath));
                                UpdaterClose();
                            }
                        }
                    };
    
                    size = GetUpdateSize(dirPath + "UpdateSize.ashx");
                    if (size == 0)
                        UpdaterClose();
                    num = 0;
                    upsize = 0;
                    UpdateList();
                    if (fileNames != null)
                        DownloadFile(0);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            /// <summary> 
            /// 获取更新文件大小统计 
            /// </summary> 
            /// <param name="filePath">更新文件数据XML</param> 
            /// <returns>返回值</returns> 
            private static long GetUpdateSize(string filePath)
            {
                long len;
                len = 0;
                try
                {
                    WebClient wc = new WebClient();
                    Stream sm = wc.OpenRead(filePath);
                    XmlTextReader xr = new XmlTextReader(sm);
                    while (xr.Read())
                    {
                        if (xr.Name == "UpdateSize")
                        {
                            len = Convert.ToInt64(xr.GetAttribute("Size"), CultureInfo.InvariantCulture);
                            break;
                        }
                    }
                    xr.Close();
                    sm.Close();
                }
                catch (WebException ex)
                {
                    MeBox(ex.Message);
                }
                return len;
            }
    
            /// <summary> 
            /// 获取文件列表并下载 
            /// </summary> 
            private static void UpdateList()
            {
                string xmlPath = dirPath + "AutoUpdater/AutoUpdater.xml";
                WebClient wc = new WebClient();
                DataSet ds = new DataSet();
                ds.Locale = CultureInfo.InvariantCulture;
                try
                {
                    Stream sm = wc.OpenRead(xmlPath);
                    ds.ReadXml(sm);
                    DataTable dt = ds.Tables["UpdateFileList"];
                    StringBuilder sb = new StringBuilder();
                    count = dt.Rows.Count;
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (i == 0)
                        {
                            sb.Append(dt.Rows[i]["UpdateFile"].ToString());
                        }
                        else
                        {
                            sb.Append("," + dt.Rows[i]["UpdateFile"].ToString());
                        }
                    }
                    fileNames = sb.ToString().Split(',');
                    sm.Close();
                }
                catch (WebException ex)
                {
                    MeBox(ex.Message);
                }
            }
    
            /// <summary> 
            /// 下载文件 
            /// </summary> 
            /// <param name="arry">下载序号</param> 
            string m_file;
            string[] m_files;
            string ser_path;
            string loc_path;
            string file_path;
            private void DownloadFile(int arry)
            {
                try
                {
                    num++;
                    file_path = "";
                    m_file = fileNames[arry];
                    m_files = m_file.Split('\');
                    fileName=m_files[m_files.Length-1];
                    //fileName = fileNames[arry];
                    this.label1.Text = String.Format(
                        CultureInfo.InvariantCulture,
                        "更新进度 {0}/{1}  [ {2} ]",
                        num,
                        count,
                        ConvertSize(size));
                     ser_path = dirPath + "AutoUpdater/";
                     loc_path = Application.StartupPath + "\AutoUpdater\";
                    //string ser_path = dirPath + "AutoUpdater/" + fileName;
                    //string loc_path = Application.StartupPath + "\AutoUpdater\" + fileName;
                    this.progressBar2.Value = 0;
                    foreach (string item in m_files)
                    {
    
                        if (item == m_files[m_files.Length - 1])
                        {
                            //file_path += item;
                        }
                        else
                        {
                            if (!Directory.Exists(loc_path + file_path + item))
                            {
                                Directory.CreateDirectory(loc_path + file_path + item);
                            }
                            file_path += item + "\";
                        }                
                    }
                    
                    this.downWebClient.DownloadFileAsync(
                        new Uri(ser_path+file_path+fileName),loc_path+file_path+fileName);
                }
                catch (WebException ex)
                {
                    MeBox(ex.Message);
                }
            }
    
            /// <summary> 
            /// 转换字节大小 
            /// </summary> 
            /// <param name="byteSize">输入字节数</param> 
            /// <returns>返回值</returns> 
            private static string ConvertSize(long byteSize)
            {
                string str = "";
                float tempf = (float)byteSize;
                if (tempf / 1024 > 1)
                {
                    if ((tempf / 1024) / 1024 > 1)
                    {
                        str = ((tempf / 1024) / 1024).ToString("##0.00", CultureInfo.InvariantCulture) + "MB";
                    }
                    else
                    {
                        str = (tempf / 1024).ToString("##0.00", CultureInfo.InvariantCulture) + "KB";
                    }
                }
                else
                {
                    str = tempf.ToString(CultureInfo.InvariantCulture) + "B";
                }
                return str;
            }
    
            /// <summary> 
            /// 弹出提示框 
            /// </summary> 
            /// <param name="txt">输入提示信息</param> 
            private static void MeBox(string txt)
            {
                MessageBox.Show(
                    txt,
                    "提示信息",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Asterisk,
                    MessageBoxDefaultButton.Button1,
                    MessageBoxOptions.DefaultDesktopOnly);
            }
    
            /// <summary> 
            /// 关闭程序 
            /// </summary> 
            private static void UpdaterClose()
            {
                //try
                //{
                //    System.Diagnostics.Process.Start(Application.StartupPath + "\QWeiXinPrinter.exe");
                //}
                //catch (Win32Exception ex)
                //{
                //    MeBox(ex.Message);
                //}
                //Application.Exit();
            }
    
            /// <summary> 
            /// 读取.exe.config的值 
            /// </summary> 
            /// <param name="path">.exe.config文件的路径</param> 
            /// <param name="appKey">"key"的值</param> 
            /// <returns>返回"value"的值</returns> 
            internal static string GetConfigValue(string path, string appKey)
            {
                XmlDocument xDoc = new XmlDocument();
                XmlNode xNode;
                XmlElement xElem = null;
                try
                {
                    xDoc.Load(path);
    
                    xNode = xDoc.SelectSingleNode("//appSettings");
    
                    xElem = (XmlElement)xNode.SelectSingleNode("//add[@key="" + appKey + ""]");
                }
                catch (XmlException ex)
                {
                    MeBox(ex.Message);
                }
                if (xElem != null)
                    return xElem.GetAttribute("value");
                else
                    return "";
            }
    
            /// <summary> 
            /// 设置.exe.config的值 
            /// </summary> 
            /// <param name="path">.exe.config文件的路径</param> 
            /// <param name="appKey">"key"的值</param> 
            /// <param name="appValue">"value"的值</param> 
            internal static void SetConfigValue(string path, string appKey, string appValue)
            {
                XmlDocument xDoc = new XmlDocument();
                try
                {
                    xDoc.Load(path);
    
                    XmlNode xNode;
                    XmlElement xElem1;
                    XmlElement xElem2;
    
                    xNode = xDoc.SelectSingleNode("//appSettings");
    
                    xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@key="" + appKey + ""]");
                    if (xElem1 != null) xElem1.SetAttribute("value", appValue);
                    else
                    {
                        xElem2 = xDoc.CreateElement("add");
                        xElem2.SetAttribute("key", appKey);
                        xElem2.SetAttribute("value", appValue);
                        xNode.AppendChild(xElem2);
                    }
                    xDoc.Save(Application.StartupPath + "\" + path);
                }
                catch (XmlException ex)
                {
                    MeBox(ex.Message);
                }
            }
    
            /// <summary> 
            /// 判断软件的更新日期 
            /// </summary> 
            /// <param name="Dir">服务器地址</param> 
            /// <returns>返回日期</returns> 
            private static string GetTheLastUpdateTime(string Dir)
            {
                string LastUpdateTime = "";
                string AutoUpdaterFileName = Dir + "AutoUpdater/AutoUpdater.xml";
                try
                {
                    WebClient wc = new WebClient();
                    Stream sm = wc.OpenRead(AutoUpdaterFileName);
                    XmlTextReader xml = new XmlTextReader(sm);
                    while (xml.Read())
                    {
                        if (xml.Name == "UpdateTime")
                        {
                            LastUpdateTime = xml.GetAttribute("Date");
                            break;
                        }
                    }
                    xml.Close();
                    sm.Close();
                }
                catch (WebException ex)
                {
                    MeBox(ex.Message);
                }
                return LastUpdateTime;
            }
        }
    }
  • 相关阅读:
    SQL语句常见优化方法
    MySql索引
    Zookeeper学习记录(一):设计与实现
    linux下修改防火墙端口对外开放方法
    Kafka的Producer以及Consumer远程调用问题
    kafka与Spring的集成
    Kafka在Linux环境下搭建过程
    kafka-分布式消息系统
    打字母的游戏&Java入门
    SVN流程图协作图
  • 原文地址:https://www.cnblogs.com/Iyce/p/4202972.html
Copyright © 2011-2022 走看看