C# Winform自动升级(二)升级包下载升级

2020年11月29日 Jerry 3290 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清理完成!");
}
}

最终实现的效果:

jerrycoding C# winform 控件跟随窗口大小缩放

jerrycoding C# winform 控件跟随窗口大小缩放

源码下载: https://github.com/DreamerLS1994/autoupdater


原创文章,转载请注明出处: https://jerrycoding.com/article/csharp-autoupdate2

微信
jerry微信赞助
支付宝
jerry支付宝赞助

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论