更新文件方法

在确定存在新版本以后,下一步就是更新本地文件。方法同样也很多,就只说我自己的思路吧。

更新程序和主程序分离,为两个独立的EXE,更新在主程序根目录下的一个文件夹内。在主程序打开更新程序验证完更新信息开始下载以后,首先关闭主程序,然后遍历根目录下所有文件,遇到文件便删除,遇到文件夹不做任何操作(建立文件夹存放更新程序的原因),然后便从远程地址下载程序压缩包到更新文件夹,解压到主程序根目录,删除压缩包,最后退出更新程序打开主程序(当然不是最开始的那个主程序了)。

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

实现代码

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

判断更新

//此处自定义函数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("http://www.loyingxi.eu.org/AppVersion.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("http://www.loyingxi.eu.org/files/App.zip"), "Latest.zip");

解压压缩包

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

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

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