2020年11月29日
Jerry
4292
2021年1月17日
上一篇说到Winform的第一部分:XML升级文件解析与版本号校验,这里继续后面的升级文件下载与升级。
1、根据XML升级文件解析出的升级包下载路径下载升级包
/// <summary>
/// 升级包下载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
string url = g_upxml.url;
richTextBox1.AppendText("\n开始下载升级文件...");
try
{
g_zipname = System.IO.Path.GetFileName(url);
client.DownloadFile(url, System.Environment.CurrentDirectory + "\\" + g_zipname);
richTextBox1.AppendText("\n下载升级文件完成!");
}
catch (Exception ex)
{
richTextBox1.AppendText("\n下载失败,错误" + ex.Message);
}
}
2、下载完成后,计算下载文件的Md5,与XML升级文件中的Md5进行比较,没问题的话,将升级包解压到临时文件夹。
/// <summary>
/// 解压文件到临时目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
//解压前先校验文件
richTextBox1.AppendText("\n开始验证下载文件...");
string zipname = System.Environment.CurrentDirectory + "\\" + g_zipname;
//先验证Md5
FileStream fs = new FileStream(zipname, FileMode.Open);
// 读取文件的 byte[]
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
// 把 byte[] 转换成 Stream
Stream stream = new MemoryStream(bytes);
string md5 = getMd5byStream(stream);
if (md5 != g_upxml.md5)
{
richTextBox1.AppendText("\n下载文件验证失败!Md5不一致!");
return;
}
richTextBox1.AppendText("\n下载文件验证成功!");
//临时解压路径
string tmppath = System.Environment.CurrentDirectory + "\\tmp\\";
richTextBox1.AppendText("\n开始解压升级文件...");
try
{
ZipFile.ExtractToDirectory(zipname, tmppath);
}
catch { }
richTextBox1.AppendText("\n解压升级文件完成!");
}
3、最后一步,将解压后的文件复制到原程序目录即可。
/// <summary>
/// 复制文件及文件夹
/// </summary>
/// <param name="srcPath"></param>
/// <param name="destPath"></param>
private void copyDir(string srcPath, string destPath)
{
DirectoryInfo dir = new DirectoryInfo(srcPath);
//获取目录下的文件和子目录
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();
foreach (FileSystemInfo i in fileinfo)
{
if (i is DirectoryInfo)
{
//判断是否文件夹
if (!Directory.Exists(destPath + "\\" + i.Name))
{
//目标目录下不存在此文件夹即创建子文件夹
Directory.CreateDirectory(destPath + "\\" + i.Name);
}
//递归调用复制子文件夹
copyDir(i.FullName, destPath + "\\" + i.Name);
}
else
{
//不是文件夹即复制文件,true表示可以覆盖同名文件
File.Copy(i.FullName, destPath + "\\" + i.Name, true);
}
}
}
/// <summary>
/// 替换文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button6_Click(object sender, EventArgs e)
{
//临时解压路径
string tmppath = System.Environment.CurrentDirectory + "\\tmp";
string dstpath = System.Environment.CurrentDirectory;
richTextBox1.AppendText("\n开始升级(复制)文件...");
copyDir(tmppath, dstpath);
richTextBox1.AppendText("\n升级完成!");
richTextBox1.AppendText("\n清理升级文件中...!");
DirectoryInfo di = new DirectoryInfo(tmppath);
di.Delete(true);
File.Delete(dstpath + "\\" + g_zipname);
File.Delete(dstpath + "\\" + g_upxmlname);
richTextBox1.AppendText("\n清理完成!");
}
}
最终实现的效果:
原创文章,转载请注明出处:
https://jerrycoding.com/article/csharp-autoupdate2
微信
支付宝