• Web Service 系列 → 智能升级也简单(用Web Services制作升级程序)


    升级程序的制作有多种方法,下面介绍一种用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

                {

                    ;

                }

            }

        }

    }

    效果图:
     

  • 相关阅读:
    springboot项目下载文件功能中-切面-导致的下载文件失败的bug
    解决laydate动态设置初始值的问题
    简易MySQL存储过程
    css选择器(第n个类选择器)的坑
    session过期情况下ajax请求不会触发重新登录的问题
    session过期情况下ajax请求不会触发重新登录的问题
    springboot配置多数据源mongodb
    css平移动画的实现
    springboot中使用JOIN实现关联表查询
    解决springboot项目中@Value注解参数值为null的问题
  • 原文地址:https://www.cnblogs.com/haiyabtx/p/2321538.html
Copyright © 2020-2023  润新知