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

这个是程序的组成部分。

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

先调用两个类:

//使用WebClient下载
        public WebClient client = new WebClient();

待会儿下载更新文件要用到

还有几个全局变量

//当前版本
        public string localversion = null;
        //最新版本
        public string latesversion = null;
        //主窗体
        public Form1 form;
        //通知内容
        public string nnidtext = null;

//获取本地版本号
        public void NowVersion()
        {
            System.Diagnostics.FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo("新云翻译器.exe");
            localversion = fv.FileVersion;

}

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

/// <summary>
        /// 从服务器上获取最新的版本号
        /// </summary>
        public void DownloadCheckUpdateXml()
        {
            try
            {
                //第一个参数是文件的地址,第二个参数是文件保存的路径文件名
                client.DownloadFile(http://cloudyours.net/Software//Update/NewcloudTranslator/NewcloudTranslator221210.XML, @"Update\NewcloudTranslator221210.XML");
            }
            catch
            {
                nnidtext = "没有检测到更新";
                Environment.Exit(0);
            }
        }

我们用这个方法从服务器上拿到最新的软件版本,之后会进行对比。

/// <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);
            }
        }

这个方法就是用来读取我们拿到的文档,然后存储一下,后面会用到。

/// <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);
                }
            }
        }

这个方法是用来下载安装包的,先对比一下我们读取到的最新版本号和本地版本号,如果一样就不用下载安装包,如果不一样就下载更新。

/// <summary>
        /// 安装及删除
        /// </summary>
        private void InstallandDelete()
        {
            //安装前关闭正在运行的程序
            KillProgram();
            //启动安装程序
            Process.Start(@"Update\NewCloudTranslator2_2_1_210_Setup.exe");
            JudgeInstall();
        }

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

/// <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;
        }
    }
}

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

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

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

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

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

C#实现在线更新系统的更多相关文章

  1. 手机在线更新系统MySQL数据库服务器参数优化mycnf,16G内存8核CPU,

    业务场景: 后台支持手机在线更新系统,db服务器内存16G,8核,dell的pc服务器. qps: 200个左右 tps: 1个左右 一分钟50几个 sort_buffer_size = 32M 大了 ...

  2. iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)

    iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...

  3. linux运维中的命令梳理(一)

    在linux日常运维中,我们平时会用到很多常规的操作命令. 下面对常用命令进行梳理: 命令行日常系快捷键(不分大小写)CTRL + A 移动光标到行首CTRL + E 移动光标到行末CTRL + U ...

  4. windows server system32下常见快捷指令

    win+R       命令行窗口 cmd        dos命令窗口 mstsc      远程登录输入窗口 calc         快速打卡计算器 control     打开控制面板 eve ...

  5. Linux运维笔记-日常操作命令总结(1)

    在linux日常运维中,我们平时会用到很多常规的操作命令. 查看服务器的外网ip [root@redis-new01 ~]# curl ifconfig.me [root@redis-new01 ~] ...

  6. CentOS显示设置时间命令- date

    概要: date命令的功能是显示和设置系统日期和时间 命令格式: date [OPTION]... [+FORMAT]date [-u|--utc|--universal] [MMDDhhmm[[CC ...

  7. system32下 exe文件作用

    system32下EXE文件的作用说明 A accwiz.exe 辅助功能向导 ahui.exe 应用程序兼容用户界面 alg.exe 为 Internet 连接共享和 Internet 连接防火墙提 ...

  8. MySQL数据库服务器参数优化mycnf,16G内存8核CPU,

    业务场景: 后台支持手机在线更新系统,db服务器内存16G,8核,dell的pc服务器. qps: 200个左右 tps: 1个左右 一分钟50几个 sort_buffer_size = 32M 大了 ...

  9. [转]Jetson TX1 开发教程(1)配置与刷机

    开箱 Jetson TX1是英伟达公司新出的GPU开发板,拥有世界上先进的嵌入式视觉计算系统,提供高性能.新技术和极佳的开发平台.在进行配置和刷机工作之前,先来一张全家福: 可以看到,Jetson T ...

随机推荐

  1. IOS — 关于Socket传输文件需要自定义延时或者包大小的情况

    1. 首先导入头文件 #include <stdio.h> #include <errno.h> #include <string.h> #include < ...

  2. zsh-替换掉黑白的控制台

    官方地址:里面有详细的安装指南 http://ohmyz.sh/

  3. OpenGL ES 2.0 摄像机与投影

    1.摄像机的设置 摄像机的位置坐标 摄像机的位置 摄像机up方向 Matrix.setLookAtM( mVMatrix, //存储生成矩阵元素的float[]类型数组 0, //填充起始偏移量 cx ...

  4. SATA接口硬盘加密器

    加密卡置于主板与硬盘.光驱之间,透明实时地对写入数据进行加密,对读出数据进行解密,有效防止信息被窃.未经授权的阅读和修改,以及硬盘.光盘丢失.被盗.废弃.非法用户访问而引发的敏感信息泄密问题,为用户打 ...

  5. Linux下运行C++程序出现"段错误(核心已转储)"的原因

    今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错  这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题 ...

  6. 将less编译成css的gulp插件

    简介:gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码, ...

  7. 微信JS-SDK 接口调用与 php 遇到的坑

    问题:config:invalid signature一直爆这个错误 解决: 看我把这些坑都总结了一下:要命的invalid signature. https://segmentfault.com/q ...

  8. NPAPI开发常识

    其实,就在几天前,我根本不知道什么是NPAPI插件.因为最近的项目中用到需要在非IE下检测客户端是否安装,最终找到浏览器插件NPAPI. 以下资料来源于网络收集,以此给那些和我一样迷茫的人.本文的目的 ...

  9. SpotMini末端控制策略

    相信很多人都注意到了“机器人学家”两天前推送的Boston Dynamics新机器人Spot-Mini.除了一如既往独领风骚的步态控制外,这次BD还给机器人增加了一个机械臂.视频中的一幕挺有趣,就是S ...

  10. GridView 设置背景透明以及Item的点击动画

    //将点击时的背景色设置为透明 gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 此时点击GridView的每个Item就不会出现 ...