程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【原創】自動更新程序2--更新程序的主窗體(技術:spring.net+三層架構+webservice+IrisSkin

【原創】自動更新程序2--更新程序的主窗體(技術:spring.net+三層架構+webservice+IrisSkin

編輯:C#入門知識

    上篇文章主要介紹了webservice的部署以及主要的代碼,下面給大家貼上主程序的代碼,並簡單的講解。主程序判斷是否有更新時通過主程序目錄下有一個update.ini文件內的version是否有變化,主要思路為判斷客戶端的version是否==服務器端webservice提取到的version的值,update.ini文件內容如下:

[update]
version=20132103 //通過這個客戶端的version於服務器端的version相比較,如果不等於則為更新
program=BJCreation.CallAppWindow.Windows.exe //主程序的目錄,也就是誰要啟動這個update.exe


[webservice]
url=http://localhost:1546/UpdateWeb/sxsUpdateWebService.asmx //這個就是webservice的地址
method=GetUpdateInfos //webservice的方法名

 

//關閉進度條的委托
        public delegate void CloseProgressDelegate();
        public delegate void OnGoToShowLogDegate();
        public delegate void OnGoTOShowRtbLogDelate(object message);
        //聲明關閉進度條事件
        public event CloseProgressDelegate CloseProgress;

        string serviceVersion;
        WebClient wc = null;
        IniClass ini; //ini文件的操作
        string url;//獲取下載地址 
        string[] zips;//獲取升級壓縮包
        string zip = "";//當前正在下載的壓縮包
        string uploadLog = string.Empty; //更新日志
        int zipsIndex = 0;//當前正在下載的zips下標
        long preBytes = 0;//上一次下載流量
        long currBytes = 0;//當前下載流量
        private static int time = 3;//3秒自動退出,沒有更新的話自動退出
        string filePath = string.Empty; 

public FormUpdate()
        {
            InitializeComponent();
            this.btnDownload.Enabled = false;
            ini = new IniClass(Application.StartupPath + @"\Update.ini");
            Thread thread = new Thread(new ThreadStart(ThreadMethod));
            thread.Start();
        }
        /// <summary>
        /// 如果將更新程序放到根目錄下面的子目錄內,如Realeas/Update/update.exe,則啟動時需要傳遞參數調用這個方法
        /// 主程序的調用方式如下:process.start("update/update.exe","\""+Application.StartupPath+"\"");因為如果當前目錄含有空格類似c:\programes files\程序1 這樣的目錄,用start方式啟動不成功,必須要將start的參數2改為短文件名 或者直接加""的方式 
        /// 構造窗體
        /// </summary>
        /// <param name="path"></param>
        public FormUpdate( string path )
        {
            this.filePath = path;
            InitializeComponent();
            this.btnDownload.Enabled = false;
            ini = new IniClass( Application.StartupPath + @"\Update.ini" );
            Thread thread = new Thread( new ThreadStart( ThreadMethod ) );
            thread.Start();
        }

        void ThreadMethod()
        {
            try
            {
                string webServiceUrl = ini.IniReadValue("webservice", "url");//wsdl地址  
                string method = ini.IniReadValue("webservice", "method");//
                string[] strArray = (string[])WebServiceHelper.InvokeWebService(webServiceUrl, method, null);//調用webservice並返回結果
                uploadLog = strArray[3];
                zips = strArray[2].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                url = strArray[1];
                string clentVersion = ini.IniReadValue("update", "version");
                serviceVersion = strArray[0];//服務端版本
                if (!string.Equals(clentVersion, serviceVersion))
                {//如果不等則直接顯示更新日志及更新列表
                    OnGoToShowLogDegate logHandler = new OnGoToShowLogDegate(ShowLog);
                    this.Invoke(logHandler);
                }
                else
                {
                    OnGoToShowLogDegate logHandler = new OnGoToShowLogDegate(ShowRtbLogView);
                    this.Invoke(logHandler);
                }
            }
            catch (Exception ex)
            {
                OnGoTOShowRtbLogDelate logHandler = new OnGoTOShowRtbLogDelate(ShowRtbLog);
                this.Invoke(logHandler, new object[] { ex.Message });
            }
        }

void ShowLog()
        {
            this.groupBox1.Text = serviceVersion + "更新日志";
            this.rtbUpdateLog.Text = string.IsNullOrEmpty(uploadLog) ? "暫時無更新" : uploadLog;
            if (zips.Length > 0)
            {
                foreach (string item in zips)
                {
                    string size = "";
                    try
                    {
                        HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(new Uri(url + item));
                        HttpWebResponse myRes = (HttpWebResponse)myReq.GetResponse();
                        size = GetFileSize(myRes.ContentLength);
                        myRes.Close();
                    }
                    catch (Exception)
                    {
                        //如果有異常則不處理
                    }
                    ListViewItem lsv = new ListViewItem();
                    lsv.Text = item;
                    lsv.SubItems.Add(size);
                    this.lsvFiles.Items.Add(lsv);
                }
                this.btnDownload.Enabled = true;
            }
        }

        private string GetFileSize(long size)
        {
            string msg = "0B";
            if (size == 0)
            {
            }
            else if (size > 0 && size < 1024)
            {
                msg = size + "B";
            }
            else if (size > 1024 && size < 1024 * 1024)
            {
                msg = (size / 1024) + "KB";
            }
            else if (size > 1024 * 1024 && size < 1024 * 1024 * 1024)
            {
                msg = size / (1024 * 1024) + "MB";
            }
            return msg;
        }

/// <summary>
        /// 下載更新
        /// </summary>
        private void DownLoad()
        {
            try
            {
                CloseProgress += new CloseProgressDelegate(FrmUpdate_CloseProgress);
                if (zips.Length > 0)
                {
                    wc = new WebClient();
                    wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
                    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
                    wc.DownloadFileAsync(new Uri(url + zips[zipsIndex]), zips[zipsIndex]);
                }
                else
                {
                    FrmUpdate_CloseProgress();//調用關閉進度條事件
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 下載完成後觸發
        /// </summary>
        void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            try
            {
                if (zipsIndex < zips.Length)
                {
                    //繼續下載下一個壓縮包
                    wc = new WebClient();
                    wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
                    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
                    string url2 = url + zips[zipsIndex];
                    wc.DownloadFileAsync(new Uri(url2), zips[zipsIndex]);
                }
                else
                {
                    //解壓
                    string _path = string.IsNullOrEmpty(filePath) ? Application.StartupPath : filePath;
                    int maximum = ZipClass.GetMaximum(zips, _path);
                    foreach (string zip in zips)
                    {
                        string fileName = _path + @"\" + zip;
                        string extension = Path.GetExtension(fileName);
                        if (extension != ".zip")
                        {
                            //如果不是zip的文件則不允許解壓。
                            continue;
                        }
                        ZipClass.UnZip(_path + @"\" + zip, "", maximum, FrmUpdate_SetProgress);
                        File.Delete(_path + @"\" + zip);

                    }
                    FrmUpdate_CloseProgress();//調用關閉進度條事件
                }
                //此行放置在此處
                zipsIndex++;
            }
            catch (Exception ex)
            {
                Log.LogToFile(ex.Message);
            }
        }
        /// <summary>
        /// 下載時觸發
        /// </summary>
        void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged), new object[] { sender, e });
            }
            else
            {
                try
                {
                    lblMessage.Text = "正在下載自解壓包  " + zips[zipsIndex] + "(" + (zipsIndex + 1).ToString() + "/" + zips.Length + ")";
                    progressBar1.Maximum = 100;
                    progressBar1.Value = e.ProgressPercentage;
                    currBytes = e.BytesReceived;//當前下載流量
                }
                catch (Exception)
                {
                    //如果出錯,直接運行。
                }
            }
        }
        /// <summary>
        /// 解壓時進度條事件
        /// </summary>
        /// <param name="maximum">進度條最大值</param>
        private void FrmUpdate_SetProgress(int maximum, string msg)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new ZipClass.SetProgressDelegate(FrmUpdate_SetProgress), new object[] { maximum, msg });
            }
            else
            {
                timer1.Enabled = false;
                //this.Text = "升級";
                if (zipsIndex == zips.Length)
                {
                    //剛壓縮完
                    progressBar1.Value = 0;
                    zipsIndex++;
                }
                lblMessage.Text = "正在解壓" + msg + "(" + (progressBar1.Value + 1).ToString() + "/" + maximum + ")";
                progressBar1.Maximum = maximum;
                progressBar1.Value++;

            }
        }

----

 

 

                    Process _process = new Process();
                    _process.StartInfo.FileName = "Update/BJCreation.AutoUpdate.Windows.exe";
                    _process.StartInfo.Arguments="\""+ Application.StartupPath+"\"";
                    _process.StartInfo.WorkingDirectory =Application.StartupPath;
                    _process.Start();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved