首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

c#在线升级

    面介绍一种用Web Services制作的升级程序。通过Web Services 升级程序就象读写本机文件一样简单。所以我就直接给出代码。

    Web Services部分代码:
    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.IO;

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        public Service()
        {
            //如果使用设计的组件,请取消注释以下行
            //InitializeComponent();
        }
        /// <summary>
        /// 需要升级文件的服务器路径
        /// </summary>
        private const string UpdateServerPath ="d:\\Debug";
        [WebMethod(Description = "返回服务器上程序的版本号")]
        public string ServerVer()
        {
            return "4.0";
        }
        [WebMethod(Description = "返回需更新的文件")]
        public string[] NewFiles()
        {
            DirectoryInfo di = new DirectoryInfo(UpdateServerPath);
            FileInfo[] fi = di.GetFiles();
            int intFiles= fi.Length;
            string[] myNewFiles = new string[intFiles];
            int i = 0;
            foreach (FileInfo fiTemp in fi)
            {
                myNewFiles[i] = fiTemp.Name;
                System.Diagnostics.Debug.WriteLine(fiTemp.Name);
                i++;
            }

            return myNewFiles;
        }
        [WebMethod(Description = "返回需更新的文件的大小")]
        public int AllFileSize()
        {
            int filesize = 0;
            string[] files = Directory.GetFiles(UpdateServerPath);
            foreach (string file in files)
            {
                FileInfo myInfo = new FileInfo(file);
                filesize += (int)myInfo.Length / 1024;
            }
            return filesize;
        }

        [WebMethod(Description = "返回给定文件的字节数组")]
        public byte[] GetNewFile(string requestFileName)
        {
            ///得到服务器端的一个文件
            if (requestFileName != null || requestFileName != "")
                return getBinaryFile(UpdateServerPath + "\\"+requestFileName);
            else
                return null;
        }

        /// <summary>
        /// 返回所给文件路径的字节数组。
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        private byte[] getBinaryFile(string filename)
        {
            if (File.Exists(filename))
            {
                try
                {
                    //打开现有文件以进行读取。
                    FileStream s = File.OpenRead(filename);
                    return ConvertStreamToByteBuffer(s);
                }
                catch
                {
                    return new byte[0];
                }
            }
            else
            {
                return new byte[0];
            }
        }
        /// <summary>
        /// 把给定的文件流转换为二进制字节数组。
        /// </summary>
        /// <param name="theStream"></param>
        /// <returns></returns>
        private byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)
        {
            int b1;
            System.IO.MemoryStream tempStream = new System.IO.MemoryStream();
            while ((b1 = theStream.ReadByte()) != -1)
            {
                tempStream.WriteByte(((byte)b1));
            }
            return tempStream.ToArray();
        }

    }

    升级程序代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Xml;
    using System.IO;
    using System.Diagnostics;

    namespace AutoUpdate
    {
        public partial class frmAutoUpdate : Form
        {
            public frmAutoUpdate()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 当前版本
            /// </summary>
            private string m_strLocalVer;
            /// <summary>
            /// 服务器版本
            /// </summary>
            private string m_strServerVer;
            /// <summary>
            /// 需要更新的文件总数
            /// </summary>
            private int m_intFilesCount = 0;
            /// <summary>
            /// 需要更新的文件大小
            /// </summary>
            private int m_AllFileSize;
            /// <summary>
            /// 正在下载的文件大小
            /// </summary>
            private int m_downingFileSize;
            /// <summary>
            /// 已经下载的文件大小
            /// </summary>
            private int m_downedFileSize;
            /// <summary>
            ///数组,需要更新的文件
            /// </summary>
            private string[] m_Files = null;
            /// <summary>
            /// 定义文件对象
            /// </summary>
            WebReference.Service ws;
            /// <summary>
            /// 连接WebServeces并下载文件线程
            /// </summary>
            private Thread DownThread;
            private void frmAutoUpdata_Load(object sender, EventArgs e)
            {
                DownThread = new Thread(new ThreadStart(StartUpdate));
                DownThread.Start();
            }
            /// <summary>
            /// 连接服务器,开始升级
            /// </summary>
            private void StartUpdate()
            {
                ws = new WebReference.Service();
                m_AllFileSize = ws.AllFileSize();
                try
                {
                    m_strLocalVer =Config.Ver; //从配置文件中读取当前版本号
                    m_strServerVer = ws.ServerVer();//保存服务器版本号

                    BeginInvoke(new System.EventHandler(UpdateUI), lblLink);
                    //当前版本低于服务器版本,开始更新...
                    if (double.Parse(m_strLocalVer) < double.Parse(m_strServerVer))
                    {
                        BeginInvoke(new System.EventHandler(UpdateUI), lblDownLoad);
                        m_Files = ws.NewFiles();//需要更新的文件
                        if (m_Files != null)
                        {
                            m_intFilesCount = m_Files.Length;
                            for (int i = 0; i <= m_intFilesCount - 1; i++)
                            {
                                DownFile(m_Files[i]);
                                Debug.WriteLine(m_Files[i]);
                            }
                            // Config.VER = strServerVer;//将版本号记录到配置文件中
                        }
                    }
                    else
                    {
                        BeginInvoke(new EventHandler(OnShowMessage),
                            "你计算机上安装的已经是最新版本了,不需要升级.");
                        return;
                    }
                }
                catch (Exception ex)
                {
                    BeginInvoke(new EventHandler(OnShowMessage), ex.Message);
                    return;
                }
                //UI线程设置label属性
                BeginInvoke(new System.EventHandler(UpdateUI), lblStartExe);
                //安装文件
                MethodInvoker miSetup = new MethodInvoker(this.StartSetup);
                this.BeginInvoke(miSetup);
            }
            /// <summary>
            /// 下载文件
            /// </summary>
            /// <param name="fileName">文件名</param>
            private void DownFile(string fileName)
            {
                //得到二进制文件字节数组;
                byte[] bt = ws.GetNewFile(fileName);
                m_downingFileSize = bt.Length / 1024;
                string strPath = Application.StartupPath + "\\Update\\" + fileName;
                if (File.Exists(strPath))
                {
                    File.Delete(strPath);
                }
                FileStream fs = new FileStream(strPath, FileMode.CreateNew);
                fs.Write(bt, 0, bt.Length);
                fs.Close();
            }
            /// <summary>
            /// 开始安装下载的文件
            /// </summary>
           private void StartSetup()
            {
                // 结束当前运行的主程序
                Process[] pros = Process.GetProcesses();
                for (int i = 0; i < pros.Length; i++)
                {
                    if (pros[i].ProcessName == "教师考勤系统")
                    {
                        pros[i].Kill();
                    }
                }
                // 开始复制文件
                for (int i = 0; i <= m_intFilesCount - 1; i++)
                {
                    string sourceFileName = Application.StartupPath + "\\Update\\" + m_Files[i];
                    string destFileName = Application.StartupPath + "\\" + m_Files[i];
                    if (File.Exists(destFileName))
                    {
                        File.Delete(destFileName);
                    }
                    File.Copy(sourceFileName, destFileName, false);
                }
                // 升级完成,启动主程序
                string StrExe = Application.StartupPath + "\\教师考勤系统.exe";

                if (File.Exists(StrExe))
                {
                    System.Diagnostics.Process.Start(StrExe);
                }

                //关闭升级程序
                Application.Exit();
            }

            #region 辅助方法,确保线程安全

            /// <summary>
            /// Label上显示信息
            /// </summary>
            private void UpdateUI(object sender, EventArgs e)
            {
                Label lbl = (Label)sender;
                lbl.ForeColor = SystemColors.Desktop;
                lblLocalVer.Text = m_strLocalVer;
                lblServerVer.Text = m_strServerVer;
            }

            /// <summary>
            /// 显示对话框
            /// </summary>
            private void OnShowMessage(object sender, EventArgs e)
            {
                MessageBox.Show(this, sender.ToString(), this.Text,
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                Thread.Sleep(100);
                this.Close();
            }
            /// <summary>
            /// 显示进度条
            /// </summary>
            private void InvokePrgBar()
            {
                if (prgBar.Value < 100)
                {
                    prgBar.Value = 100 * (int)m_downedFileSize / m_AllFileSize;
                    prgBar.Update();
                    System.Diagnostics.Debug.WriteLine("prgBar.Value:{0}" + prgBar.Value);
                }
            }
            /// <summary>
            /// 计算文件已下载的百分比
            /// </summary>
            private void subPrgBar()
            {
                m_downedFileSize += m_downingFileSize;
                System.Diagnostics.Debug.WriteLine("AllFileSize  " + m_AllFileSize);
                System.Diagnostics.Debug.WriteLine("downingFileSize  " + m_downingFileSize);
                do
                {
                    Thread.Sleep(100);
                    MethodInvoker mi = new MethodInvoker(this.InvokePrgBar);
                    this.BeginInvoke(mi);
                } while (m_AllFileSize <= m_downedFileSize);
            }
            #endregion

            /// <summary>
            /// 关闭窗体时关闭线程
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void frmAutoUpdate_FormClosing(object sender, FormClosingEventArgs e)
            {
                try
                {
                    DownThread.Abort();
                }
                catch
                {
                    ;
                }
            }
        }
    }

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航