升級(jí)程序的制作有多種方法,下面介紹一種用Web Services制作的升級(jí)程序。通過(guò)Web Services 升級(jí)程序就象讀寫(xiě)本機(jī)文件一樣簡(jiǎn)單。所以我就直接給出代碼。
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()
{
//如果使用設(shè)計(jì)的組件,請(qǐng)取消注釋以下行
//InitializeComponent();
}
/// <summary>
/// 需要升級(jí)文件的服務(wù)器路徑
/// </summary>
private const string UpdateServerPath ="d:\\Debug";
[WebMethod(Description = "返回服務(wù)器上程序的版本號(hào)")]
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 = "返回給定文件的字節(jié)數(shù)組")]
public byte[] GetNewFile(string requestFileName)
{
///得到服務(wù)器端的一個(gè)文件
if (requestFileName != null || requestFileName != "")
return getBinaryFile(UpdateServerPath + "\\"+requestFileName);
else
return null;
}
/// <summary>
/// 返回所給文件路徑的字節(jié)數(shù)組。
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
private byte[] getBinaryFile(string filename)
{
if (File.Exists(filename))
{
try
{
//打開(kāi)現(xiàn)有文件以進(jìn)行讀取。
FileStream s = File.OpenRead(filename);
return ConvertStreamToByteBuffer(s);
}
catch
{
return new byte[0];
}
}
else
{
return new byte[0];
}
}
/// <summary>
/// 把給定的文件流轉(zhuǎn)換為二進(jìn)制字節(jié)數(shù)組。
/// </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();
}
}
升級(jí)程序代碼:
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>
/// 當(dāng)前版本
/// </summary>
private string m_strLocalVer;
/// <summary>
/// 服務(wù)器版本
/// </summary>
private string m_strServerVer;
/// <summary>
/// 需要更新的文件總數(shù)
/// </summary>
private int m_intFilesCount = 0;
/// <summary>
/// 需要更新的文件大小
/// </summary>
private int m_AllFileSize;
/// <summary>
/// 正在下載的文件大小
/// </summary>
private int m_downingFileSize;
/// <summary>
/// 已經(jīng)下載的文件大小
/// </summary>
private int m_downedFileSize;
/// <summary>
///數(shù)組,需要更新的文件
/// </summary>
private string[] m_Files = null;
/// <summary>
/// 定義文件對(duì)象
/// </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>
/// 連接服務(wù)器,開(kāi)始升級(jí)
/// </summary>
private void StartUpdate()
{
ws = new WebReference.Service();
m_AllFileSize = ws.AllFileSize();
try
{
m_strLocalVer =Config.Ver; //從配置文件中讀取當(dāng)前版本號(hào)
m_strServerVer = ws.ServerVer();//保存服務(wù)器版本號(hào)
BeginInvoke(new System.EventHandler(UpdateUI), lblLink);
//當(dāng)前版本低于服務(wù)器版本,開(kāi)始更新...
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;//將版本號(hào)記錄到配置文件中
}
}
else
{
BeginInvoke(new EventHandler(OnShowMessage),
"你計(jì)算機(jī)上安裝的已經(jīng)是最新版本了,不需要升級(jí).");
return;
}
}
catch (Exception ex)
{
BeginInvoke(new EventHandler(OnShowMessage), ex.Message);
return;
}
//UI線程設(shè)置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)
{
//得到二進(jìn)制文件字節(jié)數(shù)組;
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>
/// 開(kāi)始安裝下載的文件
/// </summary>
private void StartSetup()
{
// 結(jié)束當(dāng)前運(yùn)行的主程序
Process[] pros = Process.GetProcesses();
for (int i = 0; i < pros.Length; i++)
{
if (pros[i].ProcessName == "教師考勤系統(tǒng)")
{
pros[i].Kill();
}
}
// 開(kāi)始復(fù)制文件
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);
}
// 升級(jí)完成,啟動(dòng)主程序
string StrExe = Application.StartupPath + "\\教師考勤系統(tǒng).exe";
if (File.Exists(StrExe))
{
System.Diagnostics.Process.Start(StrExe);
}
//關(guān)閉升級(jí)程序
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>
/// 顯示對(duì)話框
/// </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>
/// 顯示進(jìn)度條
/// </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>
/// 計(jì)算文件已下載的百分比
/// </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>
/// 關(guān)閉窗體時(shí)關(guān)閉線程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmAutoUpdate_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
DownThread.Abort();
}
catch
{
;
}
}
}
}
效果圖:
聯(lián)系客服