Web Services制作智能升级程序

本文介绍了一种使用WebServices技术实现软件在线升级的方法,包括服务器端的WebServices代码和客户端的升级程序代码。通过这种方法,升级过程如同读写本地文件一样简单,实现了无缝升级体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

{

;

}

}

}

}

效果图:

如有问题,请留言告之。谢谢~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值