2020年11月29日
		      
                      
                          
                          Jerry
                      
                      
                          
                          107
                      
                      
                          
                          2020年12月23日
                  
              上一篇说到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
              
              
 
	      
              
	  微信
          
        
        
        
	  支付宝
          
        
      
        