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 = 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 + "\\" + 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 = 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;
        }
    }
}
时间: 2024-11-06 18:26:04

winform 在线升级的相关文章

.Net remoting方法实现简单的在线升级(上篇:更新文件)

一.前言:       最近做一个简单的在线升级Demo,使用了微软较早的.Net Remoting技术来练手. 简单的思路就是在服务器配置一个Remoting对象,然后在客户端来执行Remoting对象中的方法. 过程: (1) 读取本地dll文件的名称与版本号,与服务器的进行对比 (2) 确认需要升级的文件名称与版本号并告诉服务器,服务器将其复制到一个临时文件夹并压缩成zip (3) 将服务器的zip下载到本地的临时文件夹,并解压. 定义服务器端为UpdateServer,其配置文件为: <

从在线升级说起

b/s比c/s有一个非常大的优势在于升级简单,升级有限的服务器就ok了,而c/s模式则是每台客户机都需要升级,版本一致比较难控制,所以在线升级就成了很重要的问题. 当时研究这个的时候存在的问题是,公司所有的产品的在线升级是VB写的加上几个VC写的com组件,每个产品需要就修改部分源代码,然后编译出一个自己产品用的,然后可能一台电脑上安装了几款我们公司的产品,也有好几个升级进程,相互影响.还有如果不是管理员权限,安装补丁包就会不能写注册表之类的,有一些问题. 研究了下谷歌的一个在线升级项目,开源的

VB.NET在线升级程序源代码,可以独立使用

这个程序是我做一个办公管理系统的时候用到的,这里有源码,需要的亲拿去研究学习:vb.net在线升级程序: 程序实现了通过vb.net连接远程云服务器,并且从云服务器中获取更新,并且自动下载更新,升级本地客户端程序: 下载地址:UpEASoft.zip   429.56 KB

Android在线升级相关笔记一(解析服务器版本与当前版本比较)

大概流程:Android客户端去访问服务器上的封装了版本号等信息的xml文件,对服务器上的版本和当前版本进行比较, 如果低于服务器的版本,则下载服务器上的新版软件,进行安装替换,完成升级. 一.首先用tomcat搭建服务器,用于开发测试. 下载tomcat请参考:http://blog.csdn.net/only_tan/article/details/25110625 1.在tomcat中新建自己的项目: \apache-tomcat-6.0.39\webapps 目录下新建自己的项目文件夹,

SequoiaDB版本在线升级介绍说明

1.前言 在SequoiaDB数据库发展过程中,基本保持每半年对外发行一个正式的Release版本.并且每个新发布的Release版本相对老版本而言,性能方面都有很大的提高,并且数据库也会在新版本中加入很多新的功能,希望能够提高数据库开发的易用性. 在SequoiaDB发展过程中,越来越多的开发者了解到它,并且对它发生兴趣.现在已经有越来越多的用户在学习.研究SequoiaDB,并且也有越来越多的企业用户在对SequoiaDB经过充分测试后,决定将SequoiaDB部署在企业的生产环境中,利用S

PIC32MZ 通过USB在线升级 -- USB CDC bootloader

了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 最近给我的开发板PIC32MZ EC starter kit写了个USB 在线升级程序--USB CDC bootloader.有了它,我可以很方便的升级我的应用程序.我大概是一个星期前开始决定写这个USB在线升级程序的,USB 有很两种类型,USB host和USB device. 由于USB host接触不多,所以我

软件更新相关,使用utuils框架在线升级,显示progressDialog,下载完成后自动弹出安装界面。

使用utuils框架在线升级,显示progressDialog,下载完成后自动弹出安装界面. 1 private void updateDownload() { 2 //检测内存设备是否可用 3 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 4 //设置存储路径 5 final String targer = Environment.getExternalStorageDirectory

BS网站在线升级(服务器通信)

背景:日前公司需要将客户企业站增加在线升级功能.即客户登录自身网站管理后台后台,发生请求到我公司门户网站,如果存在新版本则提示用户更新.客户从我们公司买到的空间.数据库.和网站代码后可以直接根据智能提示完成webconfig配置,后期客户可以从我们手中购买网站模版实现个性化风格主题的网站设置.我们所有客户的网站结构是一模一样的.因为前台客户浏览的页面均为代码自动生成的静态页,所以更新过程不影响访客浏览. 分析:BS架构项目不同与CS架构——通过请求检测版本更新后返回更新包,根据本地安装目录即可完

嵌入式系统 - 在线升级

所谓在线升级,指在Linux启动后可通过网络传输内核或者文件系统,然后替换掉原来的文件,有以下2种方法: 提示:在线升级功能要使用ramdisk文件系统.这种文件系统会加载到内存中使用,用户做任何修改都不会写入flash,不会保存. 1.uboot下将内核.文件系统等文件通过jffs2压缩后写进flash某个分区,在Linux下将次分区挂载到文件夹下, 然后就能看到这些文件,可以直接予以替换升级: 2.内核等文件直接写入flash分区中,在Linux下通过 /dev/mtdblock 设备将升级