C#实现在线更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/skylgmg/article/details/48325729

先来看一下程序完成后长什么样。

image

这个是程序的组成部分。

image

 

主要功能是在InitializationUpdate这个类中完成的,From1主要起到调用的作用,所以重心还是在InitializationUpdate这个类上,下面我们来看一下这个类完成了什么工作,都是如何完成的。

   先调用两个类:

<span style="font-family:Microsoft YaHei;font-size:14px;">//使用WebClient下载
         
public WebClient client = new WebClient();</span>



这里还有几个全局变量

<span style="font-family:Microsoft YaHei;font-size:14px;">        //当前版本
        public string localversion = null;
        //最新版本
        public string latesversion = null;
        //主窗体
        public Form1 form;
        //通知内容
        public string nnidtext = null;</span>

   这个方法帮我们拿到目前软件的版本,因为我们要拿到的版本号是我们要更新的软件的版本号,而不是本软件的版本号,这里需要注意下,别搞错了。

<span style="font-family:Microsoft YaHei;font-size:14px;">       //获取本地版本号        
        public void NowVersion()        
        {            
        System.Diagnostics.FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo("新云翻译器.exe");            
        localversion = fv.FileVersion;
        }</span>


   我们用这个方法从服务器上拿到最新的软件版本,之后会进行对比。
<span style="font-family:Microsoft YaHei;font-size:14px;">        /// <summary>
        /// 从服务器上获取最新的版本号
        /// </summary>
        public void DownloadCheckUpdateXml()
        {
            try
            {
                //第一个参数是文件的地址,第二个参数是文件保存的路径文件名
                client.DownloadFile(
http://cloudyours.net/Software//Update/NewcloudTranslator/NewcloudTranslator221210.XML
, @"Update\NewcloudTranslator221210.XML");
            }
            catch
            {
                nnidtext = "没有检测到更新";
                Environment.Exit(0);
            }
        }</span>


    这个方法就是用来读取我们拿到的文档,然后存储一下,后面会用到。
<span style="font-family:Microsoft YaHei;font-size:14px;">        /// <summary> 
        /// 读取从服务器获取的最新版本号
        /// </summary>
        public void LatestVersion()
        {
        if (File.Exists(@"Update\NewcloudTranslator221210.XML"))
        {                
           XmlDocument doc = new XmlDocument();
           //加载要读取的XML                
           doc.Load(@"Update\NewcloudTranslator221210.XML");
           //获得根节点                
           XmlElement WriteBook = doc.DocumentElement;
           //获得子节点 返回节点的集合                
           XmlNodeList Update = WriteBook.ChildNodes;
           foreach (XmlNode item in Update)
           {                    
              latesversion = item.InnerText;                
           }            
         }            
         else if (!File.Exists(@"Update\NewcloudTranslator221210.XML"))     
         {
           nnidtext = "检查更新失败";                
           Environment.Exit(0);            
          }        
         }</span>


这个方法是用来下载安装包的,先对比一下我们读取到的最新版本号和本地版本号,如果一样就不用下载安装包,如果不一样就下载更新。
<span style="font-family:Microsoft YaHei;font-size:14px;">        /// <summary>
        /// 下载安装包
        /// </summary>
        public void DownloadInstall()
        {
            if (localversion == latesversion)
            {
                nnidtext = "恭喜你,已经更新到最新版本";
            }
            else if (localversion != latesversion && File.Exists(@"Update\NewcloudTranslator221210.XML"))
            {
                nnidtext = "发现新版本,即将下载更新补丁";
                client.DownloadFile("
http://cloudtours.net/Software//Update/NewcloudTranslator/NewCloudTranslator2_2_1_210_Setup.exe"
, @"Update\NewCloudTranslator2_2_1_210_Setup.exe");
                if (File.Exists(@"Update\NewCloudTranslator2_2_1_210_Setup.exe"))
                {
                    InstallandDelete();//这里调用安装的类
                }
                else if (!File.Exists(@"Update\NewCloudTranslator2_2_1_210_Setup.exe"))
                {
                    //如果一次没有下载成功,则检查三次
                    for (int i = 1; i < 3; i++)
                    {
                        client.DownloadFile("
http://cloudtours.net/Software//Update/NewcloudTranslator/NewCloudTranslator2_2_1_210_Setup.exe"
, @"Update\NewCloudTranslator2_2_1_210_Setup.exe");
                    }
                    nnidtext = "下载失败,请检查您的网络连接是否正常";
                    Environment.Exit(0);
                }
            }
        }</span>

  这个方法就简单了,就打开一下我们的安装包,之后调用几个其他方法,其他方法会在下面附上。

<span style="font-family:Microsoft YaHei;font-size:14px;">        /// <summary>
        /// 安装及删除
        /// </summary>
        private void InstallandDelete()
        {
            //安装前关闭正在运行的程序
            KillProgram();
            //启动安装程序
            Process.Start(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
            JudgeInstall();
        }</span>


   这个方法就完成了简单的删除更新文件的。

<span style="font-family:Microsoft YaHei;font-size:14px;">/// <summary>
/// 判断安装进程是否存在
/// </summary>
public void JudgeInstall()
{
    Process[] processList = Process.GetProcesses();
    foreach (Process process in processList)
    {
        if (process.ProcessName == "NewCloudTranslator2_2_1_210_Setup.exe")
        {
            process.Kill();
            File.Delete(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
            File.Delete(@"Update\NewcloudTranslator221210.XML");
        }
        else
        {
            File.Delete(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
            File.Delete(@"Update\NewcloudTranslator221210.XML");
            return;
        }
    }
}</span>

有几个方法中用到了这个方法,并没有什么技术含量。




<span style="font-family:Microsoft YaHei;font-size:14px;">/// <summary>
/// 结束程序
/// </summary>
public void KillProgram()
{
    Process[] processList = Process.GetProcesses();
    foreach (Process process in processList)
    {
        //如果程序启动了,则杀死
        if (process.ProcessName == "新云翻译器.exe")
        {
            process.Kill();
        }
    }
}</span>



到这里就结束了,这个程序就算做完了,其实蛮简单的,就看你没有想到这点。


注:转载请注明出处:http://www.cnblogs.com/skylgmg/p/4792990.html

展开阅读全文

没有更多推荐了,返回首页