C#.NET C/S结构版本自动升级解决方案之升级包实现
C#.NET C/S结构版本自动升级解决方案之升级包实现
升级包组成:
C#源码:
C# Code:
/// <summary>
/// 升级包类
/// </summary>
[Serializable]
public class PackageFile
{
private string _PackingNo;
private string _Remark;
private List<PackageFileItem> _Files;
public PackageFile(string packingNo)
{
_PackingNo = packingNo;
_Files = new List<PackageFileItem>();
}
/// <summary>
/// 文件包的名称
/// </summary>
public string PackingNo
{
get { return _PackingNo; }
set { _PackingNo = value; }
}
/// <summary>
/// 备注
/// </summary>
public string Remark
{
get { return _Remark; }
set { _Remark = value; }
}
/// <summary>
/// 文件包的所有文件列表
/// </summary>
public List<PackageFileItem> Files
{
get { return _Files; }
set { _Files = value; }
}
/// <summary>
/// 检查文件包是否存在文件
/// </summary>
/// <param name="location">文件的地址</param>
/// <returns></returns>
public bool ExistsLocation(string location)
{
var file = from a in _Files where a.FileLocation == location select a;
return file.Count() > 0;
}
/// <summary>
/// 将文件打包
/// </summary>
/// <param name="packingName">文件包名称</param>
/// <param name="zip">是否压缩</param>
/// <param name="destinationFile">文件地址</param>
/// <returns></returns>
public bool Packing(string packingName, bool zip, string destinationFile)
{
byte[] bs = ZipTools.CompressionObject(this);
FileStream fs = File.OpenWrite(destinationFile);
fs.Write(bs, 0, bs.Length);
fs.Flush();
fs.Close();
return true;
}
/// <summary>
/// 加载压缩包
/// </summary>
/// <param name="packageFile">压缩文件地址</param>
/// <returns></returns>
public static PackageFile LoadPackage(string packageFile)
{
try
{
if (Path.GetExtension(packageFile).ToUpper() == ".PKG")
{
FileStream fs = File.OpenRead(packageFile);
byte[] buffer = new byte[fs.Length];
int count = fs.Read(buffer, 0, buffer.Length);
fs.Close();
return (PackageFile)ZipTools.DecompressionObject(buffer);
}
else
return null;
}
catch
{
return null;
}
}
/// <summary>
/// 加载压缩包
/// </summary>
/// <param name="ms">内存流</param>
/// <returns></returns>
public static PackageFile LoadPackage(MemoryStream ms)
{
return (PackageFile)ZipTools.DecompressionObject(ms.ToArray());
}
/// <summary>
/// 加入文件
/// </summary>
/// <param name="files"></param>
public void AddPackingFile(string[] files, string location, string folderName)
{
string fileLocation;
foreach (string f in files)
{
PackageFileItem item = new PackageFileItem();
FileStream fs = File.OpenRead(f);
byte[] buffer = new byte[fs.Length];
int count = fs.Read(buffer, 0, buffer.Length);
fs.Close();
fileLocation = location Path.Combine(folderName, Path.GetFileName(f));
if (false == this.ExistsLocation(location))
{
item.FileLocation = fileLocation;
item.FileBody = buffer;
item.CreateDate = File.GetCreationTime(f);//.ToString("yyyy-MM-dd hh:mm:ss");
item.FileName = Path.GetFileName(f);
item.FileSize = buffer.Length;
this.Files.Add(item);
}
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
/// <summary>
/// 升级包类
/// </summary>
[Serializable]
public class PackageFile
{
private string _PackingNo;
private string _Remark;
private List<PackageFileItem> _Files;
public PackageFile(string packingNo)
{
_PackingNo = packingNo;
_Files = new List<PackageFileItem>();
}
/// <summary>
/// 文件包的名称
/// </summary>
public string PackingNo
{
get { return _PackingNo; }
set { _PackingNo = value; }
}
/// <summary>
/// 备注
/// </summary>
public string Remark
{
get { return _Remark; }
set { _Remark = value; }
}
/// <summary>
/// 文件包的所有文件列表
/// </summary>
public List<PackageFileItem> Files
{
get { return _Files; }
set { _Files = value; }
}
/// <summary>
/// 检查文件包是否存在文件
/// </summary>
/// <param name="location">文件的地址</param>
/// <returns></returns>
public bool ExistsLocation(string location)
{
var file = from a in _Files where a.FileLocation == location select a;
return file.Count() > 0;
}
/// <summary>
/// 将文件打包
/// </summary>
/// <param name="packingName">文件包名称</param>
/// <param name="zip">是否压缩</param>
/// <param name="destinationFile">文件地址</param>
/// <returns></returns>
public bool Packing(string packingName, bool zip, string destinationFile)
{
byte[] bs = ZipTools.CompressionObject(this);
FileStream fs = File.OpenWrite(destinationFile);
fs.Write(bs, 0, bs.Length);
fs.Flush();
fs.Close();
return true;
}
/// <summary>
/// 加载压缩包
/// </summary>
/// <param name="packageFile">压缩文件地址</param>
/// <returns></returns>
public static PackageFile LoadPackage(string packageFile)
{
try
{
if (Path.GetExtension(packageFile).ToUpper() == ".PKG")
{
FileStream fs = File.OpenRead(packageFile);
byte[] buffer = new byte[fs.Length];
int count = fs.Read(buffer, 0, buffer.Length);
fs.Close();
return (PackageFile)ZipTools.DecompressionObject(buffer);
}
else
return null;
}
catch
{
return null;
}
}
/// <summary>
/// 加载压缩包
/// </summary>
/// <param name="ms">内存流</param>
/// <returns></returns>
public static PackageFile LoadPackage(MemoryStream ms)
{
return (PackageFile)ZipTools.DecompressionObject(ms.ToArray());
}
/// <summary>
/// 加入文件
/// </summary>
/// <param name="files"></param>
public void AddPackingFile(string[] files, string location, string folderName)
{
string fileLocation;
foreach (string f in files)
{
PackageFileItem item = new PackageFileItem();
FileStream fs = File.OpenRead(f);
byte[] buffer = new byte[fs.Length];
int count = fs.Read(buffer, 0, buffer.Length);
fs.Close();
fileLocation = location Path.Combine(folderName, Path.GetFileName(f));
if (false == this.ExistsLocation(location))
{
item.FileLocation = fileLocation;
item.FileBody = buffer;
item.CreateDate = File.GetCreationTime(f);//.ToString("yyyy-MM-dd hh:mm:ss");
item.FileName = Path.GetFileName(f);
item.FileSize = buffer.Length;
this.Files.Add(item);
}
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
压缩与解压缩:
使用封装工具压缩文件,一个文件就是一个升级包,每个升级包有唯一的版本号用于升级时对比。
当用户升级版本时从服务器下载升级包到本地,由PackageExtract类负责解压缩文件,将解压后的文件复制到目的地。
PackageExtract类:
由Extract方法解压缩构造器传入的升级包对象。
C# Code:
/// <summary>
/// 解压缩文件类
/// </summary>
public class PackageExtract
{
private PackageFile _pkg; //文件包
private int _ExtractSuccess = 0;
private int _ExtractFailed = 0;
/// <summary>
/// 解压成功的文件数
/// </summary>
public int ExtractSuccess
{
get { return _ExtractSuccess; }
}
/// <summary>
/// 解压失败的文件数
/// </summary>
public int ExtractFailed
{
get { return _ExtractFailed; }
}
public PackageExtract(PackageFile pkg)
{
_pkg = pkg;
}
/// <summary>
/// 解压缩文件
/// </summary>
/// <param name="extractedFiles">返回已解压缩的文件清单</param>
/// <param name="extractFolder">解压文件存放目录</param>
/// <returns></returns>
public int Extract(List<PackageFileItem> extractedFiles, string extractFolder)
{
string dest;//输出目录
foreach (PackageFileItem file in _pkg.Files)
{
try
{
//如指定输出目录,直接解压强文件到此目录
if (extractFolder != "")
{
int i = file.FileLocation.IndexOf("\\") 1;
dest = Path.Combine(extractFolder, file.FileLocation.Substring(i, file.FileLocation.Length - i));
}
else//替换目录标识符[APP]
dest = RootNameConverter.ToAbsoluteFolderName(file.FileLocation);
//升级主程序,CSFrameworkUpgraderClient.exe, 必须改为临时文件名
if (file.FileName.ToUpper() == UpgraderConfig.UpgraderProgramFile.ToUpper())
{
dest = Path.GetDirectoryName(dest) "\\" UpgraderConfig.UpgraderTempProgramFile;
}
string dir = Path.GetDirectoryName(dest);
if (false == Directory.Exists(dir)) Directory.CreateDirectory(dir); //创建目录
//删除旧文件
if (File.Exists(dest)) File.Delete(dest);
//写入文件
FileStream fs = File.OpenWrite(dest);
fs.Write(file.FileBody, 0, file.FileBody.Length);
fs.Flush();
fs.Close();
extractedFiles.Add(file);
_ExtractSuccess ;
}
catch
{
_ExtractFailed ;
}
}
return _pkg.Files.Count;
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
/// <summary>
/// 解压缩文件类
/// </summary>
public class PackageExtract
{
private PackageFile _pkg; //文件包
private int _ExtractSuccess = 0;
private int _ExtractFailed = 0;
/// <summary>
/// 解压成功的文件数
/// </summary>
public int ExtractSuccess
{
get { return _ExtractSuccess; }
}
/// <summary>
/// 解压失败的文件数
/// </summary>
public int ExtractFailed
{
get { return _ExtractFailed; }
}
public PackageExtract(PackageFile pkg)
{
_pkg = pkg;
}
/// <summary>
/// 解压缩文件
/// </summary>
/// <param name="extractedFiles">返回已解压缩的文件清单</param>
/// <param name="extractFolder">解压文件存放目录</param>
/// <returns></returns>
public int Extract(List<PackageFileItem> extractedFiles, string extractFolder)
{
string dest;//输出目录
foreach (PackageFileItem file in _pkg.Files)
{
try
{
//如指定输出目录,直接解压强文件到此目录
if (extractFolder != "")
{
int i = file.FileLocation.IndexOf("\\") 1;
dest = Path.Combine(extractFolder, file.FileLocation.Substring(i, file.FileLocation.Length - i));
}
else//替换目录标识符[APP]
dest = RootNameConverter.ToAbsoluteFolderName(file.FileLocation);
//升级主程序,CSFrameworkUpgraderClient.exe, 必须改为临时文件名
if (file.FileName.ToUpper() == UpgraderConfig.UpgraderProgramFile.ToUpper())
{
dest = Path.GetDirectoryName(dest) "\\" UpgraderConfig.UpgraderTempProgramFile;
}
string dir = Path.GetDirectoryName(dest);
if (false == Directory.Exists(dir)) Directory.CreateDirectory(dir); //创建目录
//删除旧文件
if (File.Exists(dest)) File.Delete(dest);
//写入文件
FileStream fs = File.OpenWrite(dest);
fs.Write(file.FileBody, 0, file.FileBody.Length);
fs.Flush();
fs.Close();
extractedFiles.Add(file);
_ExtractSuccess ;
}
catch
{
_ExtractFailed ;
}
}
return _pkg.Files.Count;
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898

参考文档:
FastReport.NET自动文本宽度+自动换行+自动行高|C/S开发框架
FastReport.NET2023破解版去除水印DEMO VERSION (2025.1.14/2023.2.18版本)|C/S开发框架
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)|C/S开发框架
.NET C/S架构软件用户授权设计方案(mac地址+白名单用户)|C/S开发框架
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
.NETCore WebApi运行报错:System.AggregateException:“Some services are not able to be constructed|C/S开发框架
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
CSFramework.EF数据库框架应用Schema测试多种数据库(.NET8+EFCore)|C/S开发框架
CSFrameworV6试用版开发指南 | 主程序初始化CSFramework.EF数据库框架(.NET8)|C/S开发框架
.NET Reactor(.NET混淆器)加壳软件使用|C/S开发框架
CSFramework开发框架使用.NET Reactor加壳软件导致多语言失效|C/S开发框架
.NETCore WebApi后端开发框架+达梦数据库测试报告|C/S开发框架
C#.NET调用达梦数据库的存储过程返回多张表|C/S开发框架
C#.NET 达梦数据库存储过程 获取OUT参数返回值|C/S开发框架
SqlServer数据类型、DbType类型、.NET类型与达梦数据类型关系表|C/S开发框架
.NET8 .NETCore运行环境下载|C/S开发框架
FastReport.NET自动文本宽度+自动换行+自动行高|C/S开发框架
FastReport.NET2023破解版去除水印DEMO VERSION (2025.1.14/2023.2.18版本)|C/S开发框架
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)|C/S开发框架
.NET C/S架构软件用户授权设计方案(mac地址+白名单用户)|C/S开发框架
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
.NETCore WebApi运行报错:System.AggregateException:“Some services are not able to be constructed|C/S开发框架
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
CSFramework.EF数据库框架应用Schema测试多种数据库(.NET8+EFCore)|C/S开发框架
CSFrameworV6试用版开发指南 | 主程序初始化CSFramework.EF数据库框架(.NET8)|C/S开发框架
.NET Reactor(.NET混淆器)加壳软件使用|C/S开发框架
CSFramework开发框架使用.NET Reactor加壳软件导致多语言失效|C/S开发框架
.NETCore WebApi后端开发框架+达梦数据库测试报告|C/S开发框架
C#.NET调用达梦数据库的存储过程返回多张表|C/S开发框架
C#.NET 达梦数据库存储过程 获取OUT参数返回值|C/S开发框架
SqlServer数据类型、DbType类型、.NET类型与达梦数据类型关系表|C/S开发框架
.NET8 .NETCore运行环境下载|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
