天天看點

智能更新也簡單(用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>

    /// 傳回所給檔案路徑的位元組數組。

    /// <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];

            }

            return new byte[0];

    /// 把給定的檔案流轉換為二進制位元組數組。

    /// <param name="theStream"></param>

    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.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.Diagnostics;

namespace AutoUpdate

    public partial class frmAutoUpdate : Form

        public frmAutoUpdate()

            InitializeComponent();

        /// <summary>

        /// 目前版本

        /// </summary>

        private string m_strLocalVer;

        /// 伺服器版本

        private string m_strServerVer;

        /// 需要更新的檔案總數

        private int m_intFilesCount = 0;

        /// 需要更新的檔案大小

        private int m_AllFileSize;

        /// 正在下載下傳的檔案大小

        private int m_downingFileSize;

        /// 已經下載下傳的檔案大小

        private int m_downedFileSize;

        ///數組,需要更新的檔案

        private string[] m_Files = null;

        /// 定義檔案對象

        WebReference.Service ws;

        /// 連接配接WebServeces并下載下傳檔案線程

        private Thread DownThread;

        private void frmAutoUpdata_Load(object sender, EventArgs e)

            DownThread = new Thread(new ThreadStart(StartUpdate));

            DownThread.Start();

        /// 連接配接伺服器,開始更新

        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);

        /// 下載下傳檔案

        /// <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();

        /// 開始安裝下載下傳的檔案

       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 輔助方法,確定線程安全

        /// Label上顯示資訊

        private void UpdateUI(object sender, EventArgs e)

            Label lbl = (Label)sender;

            lbl.ForeColor = SystemColors.Desktop;

            lblLocalVer.Text = m_strLocalVer;

            lblServerVer.Text = m_strServerVer;

        /// 顯示對話框

        private void OnShowMessage(object sender, EventArgs e)

            MessageBox.Show(this, sender.ToString(), this.Text,

                MessageBoxButtons.OK, MessageBoxIcon.Information);

            Thread.Sleep(100);

            this.Close();

        /// 顯示進度條

        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);

        /// 計算檔案已下載下傳的百分比

        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

        /// 關閉窗體時關閉線程

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void frmAutoUpdate_FormClosing(object sender, FormClosingEventArgs e)

                DownThread.Abort();

                ;