提升程序的逼格:添加自动更新功能

现在几乎所有软件都带有更新功能,对于我们这些业余爱好者,更新功能也是提高程序逼格和使用体验的不可缺少的一步。写作本文的目的主要就是为了介绍实现更新功能的思路以及用C#实现更新功能(WinForm),为了不至于内容特别空,我拿大家喜欢的SuperBuster最新的测试版来当例子。

实现思路

首先更新第一步那肯定是要判断更新的,把现在的版本号和最新的版本号进行对比。那么现在程序的版本号保存在本地配置文件中,程序先读取版本号然后获取最新版本号,对比以后判断是否更新。获取最新版本号的方法有很多。下面是我用到过也是比较方便的两种不同方法:

通过第三方平台判断更新

现如今很多代码托管平台都支持项目创建发行版的功能,比如Github(主要讨论Github)。Github也提供API可以用来查询项目的各种数据,其中就包括了项目中发行版的版本信息和文件下载链接。通过获取到的版本信息与程序配置文件中的进行比对,判断是否是最新版本。

但是通过Github项目中的发行版判断更新我不常用,通常是作为程序更新设置中的一种可选模式,因为Github可能在某些时候访问不了,或者不稳定(懂得都懂)。

下面是Github的API获取指定用户下的指定仓库中最新发行版的数据的命令格式,调用API获取数据看以前的这一文:《C#调用Web接口获取数据简易实现》

https://api.github.com/repos/用户名/项目名/releases/latest

通过远程文件内容判断更新

这种方法个人认为简单实用稳定,我推荐这种方法。这个标题说的就很清楚了,一般是在远程服务器的可访问的位置,网站下放一个存放最新版本号的文件(可以直接发请求读取数据),像TXT,HTML,JSON呐。然后通过上文提到的那个以前那一文提高的方法获取版本信息就好了(本文主要讨论此方法)。

更新文件方法

在确定存在新版本以后,下一步就是更新本地文件。方法同样也很多,就只说我自己的思路吧。更新程序和主程序分离,为两个独立的EXE,更新在主程序根目录下的一个文件夹内。在主程序打开更新程序验证完更新信息开始下载以后,首先关闭主程序,然后遍历根目录下所有文件,遇到文件便删除,遇到文件夹不做任何操作(建立文件夹存放更新程序的原因),然后便从远程地址下载程序压缩包到更新文件夹,解压到主程序根目录,删除压缩包,最后退出更新程序打开主程序(当然不是最开始的那个主程序了)。

这就是全部思路,梳理完后你会发现其实实现更新功能很简单。

实现代码

我只给关键的代码,也不会说该放哪些控件。本文中所有代码均在SuperBuster项目中。

判断更新

复述一遍前文(《C#调用Web接口获取数据简易实现》)代码及注释。

//此处自定义函数HttpGet
public static string HttpGet(string url)
        {
            Encoding encoding = Encoding.UTF8;//编码方式,此处为UTF-8
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//创建Http请求
            request.Method = "GET";//请求方法,此处为GET
            request.Accept = "text/html, application/xhtml+xml, */*";//媒体类型
            request.ContentType = "application/json";//JSON数据格式
            request.Timeout = 20000;//超时时间,以毫秒为单位
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();//发送请求
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                return reader.ReadToEnd();//返回数据
            }
        }

读取版本号并赋值给全局变量Version(字符串)。获取文件内容,将html文件中的版本号用全局变量b(字符串)储存,通过两变量对比判断更新。

                try
                {
                    button1.Enabled = false;
                    label1.Text = "正在检查更新......";
                    b = HttpGet("https://thrower.cc/SuperBusterLatestVersion.html");
                    if (b != Version)
                    {
                        MessageBox.Show("发现新版本!最新版本为:" + b, "提示");
                        button1.Enabled = true;
                        button2.Enabled = true;
                    }
                    else
                    {
                        MessageBox.Show("当前为最新版本!", "提示");
                        button1.Enabled = true;
                    }
                }
                catch
                {
                    MessageBox.Show("未知错误!", "提示");
                    button1.Enabled = true;
                }

删除旧版本文件

首先获取父目录,因为更新程序在主程序根目录下的子目录中。然后遍历所有文件以及目录。因为项目中只有一个文件夹(存放更新程序),所以遇到目录不处理就好,遇到文件便删除。不同项目设计不同,如果你的项目中根目录下的目录不止更新目录一个,那么就要费点心重新想重新写了(当然还有很多种方法)。

                DirectoryInfo info = new DirectoryInfo(Application.StartupPath);
                string a = info.Parent.FullName;
                DirectoryInfo dir = new DirectoryInfo(a);
                FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();
                foreach (FileSystemInfo i in fileinfo)
                {
                    if (i is DirectoryInfo)
                    {
                    }
                    else
                    {
                        File.Delete(i.FullName);
                    }
                }

下载新版本压缩包

下载文件本来是很复杂的操作,要写很多代码,但是WebClient类让下载变得非常轻松。通过WebClient把新版本压缩包下载保存到更新程序所在的目录。

                WebClient webClient = new WebClient();
                webClient.DownloadFile(new Uri("https://thrower.cc/files/SuperBuster.zip"), "Latest.zip");

解压压缩包

通过ZipFile类,解压文件到原来的主程序根目录下,然后删除压缩包。

                ZipFile.ExtractToDirectory(Directory.GetCurrentDirectory() + "/Latest.zip", a);
                File.Delete("Latest.zip");

更新功能到此就完成了,非常的简单。当然这个例子中仍然有很多不足的地方,比如如果主程序根目录下不止一个子目录,要增加额外的判断或者换思路,没有备份,如果更新失败如中途退出,那么删除的文件无法恢复等等。大家可以自己完善!

作者: Thrower
本文采用 CC BY-NC-SA 4.0 协议

评论

  1. Teacher Du
    Windows Edge 94.0.992.31
    3周前
    2021-10-01 16:42:43

    这个功能非常实用!

    • Thrower 博主
      Windows Firefox 92.0
      3周前
      2021-10-01 16:43:39

      那确实

  2. awa
    iPad AppleWebKit 605.1.15
    3周前
    2021-10-01 19:59:44


    跟我之前思路差不多啊

  3. Duseus
    Windows Chrome 94.0.4606.61
    2周前
    2021-10-05 22:06:14

    汪峰我也听哈哈

    • Thrower 博主
      Windows Firefox 92.0
      2周前
      2021-10-06 22:53:18

      太好了!同道中人!

  4. 访客
    Windows Chrome 69.0.3497.100
    1周前
    2021-10-11 11:33:46

    请问dalao,有没有轻便一点的编C#的工具

  5. 枋柚子
    Windows Chrome 94.0.4606.81
    4天前
    2021-10-17 12:52:51

    前来围观

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇