转载 升级程序的制作方法
收藏 原帖地址 :http://blog.csdn.net/chendazhi/archive/2006/05/09/715542.aspx
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();
}

辅助方法,确保线程安全

/// <summary>
/// 关闭窗体时关闭线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmAutoUpdate_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
DownThread.Abort();
}
catch
{
;
}
}
}
}
在创建Web服务时要把位置改为:文件系统(默认为HTTP)
升级程序的制作有多种方法,下面介绍一种用Web Services制作的升级程序。通过Web Services 升级程序就象读写本机文件一样简单。所以我就直接给出代码。
Web Services部分代码:

















































































































升级程序代码:











































































































































































































在创建Web服务时要把位置改为:文件系统(默认为HTTP)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器