現在但凡是一個程式都有相應的升級程式,如果你的程式沒有相應的升級程式,那麼你就需要留意了。你的使用者很可能丟失!!!網上關於自動升級的例子也有很多,前幾天一個朋友很苦惱的跟我說它的客戶在逐漸減少(據他所說,他都客戶因為他的程式升級很麻煩,所以很多人放棄了使用它的軟體),問我說怎麼辦?其實他也知道該怎麼辦?所以...朋友嘛!就給他做了一個自動升級程式。恰好今天CSDN上的一位老友也詢問這件事情,所以就把代碼共用大家了。
先個幾個圖:
主要原理(相當簡單):
升級程式一定要是一個單獨的exe,最好不要和你的程式綁到一起(否則升級程式無法啟動)。主程式退出----升級程式啟動----升級程式訪問你的網站的升級設定檔-----讀取設定檔裡面資訊-----下載-----升級程式關閉----主程式啟動
主要代碼:
1.讀取設定檔:
private void GetUpdateInfo()<br /> {<br /> //擷取伺服器資訊<br /> WebClient client = new WebClient();<br /> doc = new XmlDocument();<br /> try<br /> {<br /> doc.Load(client.OpenRead("http://192.168.3.43/update/update.xml"));<br /> //doc.Load(client.OpenRead(Config.IniReadValue("Update","UpdateURL",Application.StartupPath+"//config.ini")+"//update.xml"));<br /> //doc.Load(Application.StartupPath + "//update.xml");<br /> client = null;<br /> }<br /> catch<br /> {<br /> this.labHtml.Text = "無法取得更新檔案!程式升級失敗!";<br /> return;<br /> }<br /> if (doc == null)<br /> return;<br /> //分析檔案<br /> XmlNode node;<br /> //擷取檔案清單<br /> string RootPath = doc.SelectSingleNode("Product/FileRootPath").InnerText.Trim();<br /> node = doc.SelectSingleNode("Product/FileList");<br /> if (node != null)<br /> {<br /> foreach (XmlNode xn in node.ChildNodes)<br /> {<br /> this.listView1.Items.Add(new ListViewItem(new string[]<br /> {<br /> xn.Attributes["Name"].Value.ToString(),<br /> new WebFileInfo(RootPath+xn.Attributes["Name"].Value.ToString()).GetFileSize().ToString(),<br /> "---"<br /> }));<br /> }<br /> }<br /> }
2.檔案下載:
/// <summary><br />/// 下載檔案<br />/// </summary><br />public void Download()<br />{<br />FileStream fs = new FileStream( this.strFile,FileMode.Create,FileAccess.Write,FileShare.ReadWrite );<br />try<br />{<br />this.objWebRequest = (HttpWebRequest)WebRequest.Create( this.strUrl );<br />this.objWebRequest.AllowAutoRedirect = true;<br />//int nOffset = 0;<br />long nCount = 0;<br />byte[] buffer = new byte[ 4096 ];//4KB<br />int nRecv = 0;//接收到的位元組數<br />this.objWebResponse = (HttpWebResponse)this.objWebRequest.GetResponse();<br />Stream recvStream = this.objWebResponse.GetResponseStream();<br />long nMaxLength = (int)this.objWebResponse.ContentLength;<br />if( this.bCheckFileSize && nMaxLength != this.nFileSize )<br />{<br />throw new Exception( string.Format( "檔案/"{0}/"被損壞,無法下載!",Path.GetFileName( this.strFile ) ) );<br />}<br />if( this.DownloadFileStart != null )<br />this.DownloadFileStart( new DownloadFileStartEventArgs( (int)nMaxLength ) );<br />while( true )<br />{<br />nRecv = recvStream.Read( buffer,0,buffer.Length );<br />if( nRecv == 0 )<br />break;<br />fs.Write( buffer,0,nRecv );<br />nCount += nRecv;<br />//引發下載塊完成事件<br />if( this.DownloadFileBlock != null )<br />this.DownloadFileBlock( new DownloadFileEventArgs( (int)nMaxLength,(int)nCount ) );<br />}<br />recvStream.Close();<br />//引發下載完成事件<br />if( this.DownloadFileComplete != null )<br />this.DownloadFileComplete( this,EventArgs.Empty );<br />}<br />finally<br />{<br />fs.Close();<br />}<br />}<br />
歡迎轉載,轉載請註明出處:)