首页 > 代码库 > winform 在线升级

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>1\3.txt</UpdateFile>  </UpdateFileList><UpdateFileList>    <UpdateFile>1\4.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 = http://www.mamicode.com/Convert.ToInt32(tempf * 100);                    this.progressBar2.Value =http://www.mamicode.com/ ex.ProgressPercentage;                };                //委托下载完成时事件                 this.downWebClient.DownloadFileCompleted += delegate(object wcsender, AsyncCompletedEventArgs ex)                {                    if (ex.Error != null)                    {                        MeBox(ex.Error.Message);                    }                    else                    {                        //if (File.Exists(Application.StartupPath + "\\" + fileName))                        //{                        //    File.Delete(Application.StartupPath + "\\" + fileName);                        //}                        //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 = http://www.mamicode.com/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;        }    }}

 

winform 在线升级