zoukankan      html  css  js  c++  java
  • 智能升级也简单(用Web Services制作升级程序)(转载)

    原文:http://blog.csdn.net/chendazhi/archive/2006/05/09/715542.aspx
    升级程序的制作有多种方法,下面介绍一种用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

                {

                    ;

                }

            }

        }

    }


    效果图:


  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/hill/p/527592.html
Copyright © 2011-2022 走看看