`
zheyiw
  • 浏览: 998207 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

程序更新小功能据

    博客分类:
  • C#
C# 
阅读更多

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace BaobaoAutoUpdate
{
    public partial class Form1 : Form
    {
        const string serviceAddressFileName = "ServiceAddress.txt";
        const string versionFileName = "Version.txt";
        const string unrarPathFileName = "UnrarPath.txt";
        string unrarPath = "./";//解压文件存放目录,程序的目录
        string downloadFileName = "";//下载的文件名

        //文件下载地址
        private string ServiceAddress
        {
            get
            {
                return txtURL.Text;
            }
        }

        private string ConfigPath
        {
            get
            {
                return Environment.CurrentDirectory + "/Config/";
            }
        }

        // string serviceAddress = "http://192.168.1.104/";
        string url4DownloadFileName = "http://192.168.1.104/BBAUService/DownloadFile.html";  //从这里获取需要下载的文件名称
        string url4NewVersion = "http://192.168.1.104/BBAUService/Version.html"; //从这里获取服务器版本号

        //下载文件存放目录
        string downloadTempPath = Environment.CurrentDirectory + "/Download/";

        //下载文件保存名称
        //string rarFileName = "a.rar";

        //RAR压缩程序路径
        string rarExePath = Environment.CurrentDirectory + "/WinRAR/WinRAR.exe";

        //版本号
        string versionNoOld = "";//本地的
        string versionNoNew = "";//服务器的

        public Form1()
        {
            InitializeComponent();

            string serviceAddress = GetSringFromFile(ConfigPath + "/" + serviceAddressFileName); //获取服务地址 
            versionNoOld = GetSringFromFile(ConfigPath + "/" + versionFileName); //获取本地版本号
            unrarPath = GetSringFromFile(ConfigPath + "/" + unrarPathFileName); //
            if (isNull(unrarPath))
            {
                string currentPath = Environment.CurrentDirectory;
                unrarPath = currentPath.Substring(0, currentPath.LastIndexOf("\\"));
            }
            txtURL.Text = serviceAddress;
            txtSavePath.Text = unrarPath;
            lblVersionNoOld.Text = versionNoOld;

            this.Load += Form1_Load;
            btnCheck.Focus();
        }

        void Form1_Load(object sender, EventArgs e)
        {
            btnCheck_Click(null, null);//检查新版本
        }

        //保存服务地址
        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                BaobaoUtil.SaveStringToFile(txtURL.Text, ConfigPath, serviceAddressFileName);
                BaobaoUtil.SaveStringToFile(txtSavePath.Text, ConfigPath, unrarPathFileName);
            }
            catch (Exception ex)
            {
                BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "保存文件失败失败: " + ex.Message);
            }
        }

        //检查更新
        private void btnCheck_Click(object sender, EventArgs e)
        {
            if (isNull(ServiceAddress))
            {
                lblMsg.Text = "服务地址不能为空!";
                return;
            }
            url4DownloadFileName = ServiceAddress + "/BBAUService/DownloadName.html";
            url4NewVersion = ServiceAddress + "/BBAUService/Version.html";

            lblVersionNoNew.Text = "";
            lblUpdateFileName.Text = "";
            Thread thread = new Thread(new ThreadStart(DoCheck));
            thread.Start();
        }

        private void DoCheck()
        {
            BeginInvoke(new Del_DoCheck_Msg(CheckBegin), "");

            if (!isNull(url4NewVersion))
            {
                //获取服务器版本号
                try
                {
                    versionNoNew = BaobaoUtil.GetStringFromURL(url4NewVersion);
                    downloadFileName = BaobaoUtil.GetStringFromURL(url4DownloadFileName);
                    BeginInvoke(new Del_DoCheck_Msg(CheckFinish), "");
                }
                catch (Exception e)
                {
                    BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "调用服务[" + url4NewVersion + "]或[" + url4DownloadFileName + "]失败:\n" + e.Message);
                    BeginInvoke(new Del_DoCheck_Msg(CheckFinish), e.Message);
                }
            }
        }

        private void CheckBegin(string msg)
        {
            SetButtonEnabled(false);

            if (isNull(msg))
            {
                lblMsg.Text = "检查中...";
            }
            else
            {
                lblMsg.Text = msg;
            }
        }

        private void CheckFinish(string msg)
        {
            SetButtonEnabled(true);

            lblVersionNoNew.Text = versionNoNew;
            lblUpdateFileName.Text = downloadFileName;
            if (isNull(msg))
            {
                //比对版本号
                if (versionNoOld.CompareTo(versionNoNew) < 0)
                {
                    //提示有新版本
                    lblMsg.Text = "发现新版本!";
                }
                else
                {
                    lblMsg.Text = "已是最新版本!";
                }
            }
            else
            {
                lblMsg.Text = msg;
            }
        }

        //下载,并解压
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            if (versionNoOld.CompareTo(versionNoNew) < 0)
            {
            }
            else
            {
                if (DialogResult.OK != MessageBox.Show("已是最新版本! 确定进行更新吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information))
                {
                    return;
                }
            }

            if (isNull(downloadFileName))
            {
                ShowMsg("在位置[ " + url4DownloadFileName + " ]没有获取到下载文件名 ");
                return;
            }
            lblMsg.Text = "正在更新程序,下载中...";
            unrarPath = txtSavePath.Text;
            SetButtonEnabled(false);
            Thread thread = new Thread(new ThreadStart(Update2NewVersion));
            thread.Start();
            //BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "正在更新程序,下载中...");
            //Update2NewVersion();
        }

        //更新程序到新版本,新线程中进行
        private void Update2NewVersion()
        {
            string urlDownload = ServiceAddress + "/BBAUService/" + downloadFileName;
            try
            {
                //TODO 开线程做进度条
                // BaobaoUtil.HttpDownloadFile(urlDownload, downloadTempPath, rarFileName, progressBar1);
                //BaobaoUtil.HttpDownloadFile2(urlDownload, downloadTempPath, rarFileName, updateProgress);
                HttpDownloadFile(urlDownload, downloadTempPath, downloadFileName);
                //下载完成后,显示解压中
                ShowPro(100);
                BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "正在更新程序,解压中...");
                if (BaobaoUtil.UnRAR(unrarPath, downloadTempPath, downloadFileName, rarExePath))
                {
                    //保存新的版本号等
                    BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "正在完成更新...");
                    if (!isNull(versionNoNew))
                    {
                        //保存配置文件
                        btnSave_Click(null, null);
                        //保存新的版本号                       
                        BaobaoUtil.SaveStringToFile(versionNoNew, ConfigPath, versionFileName);
                    }
                }

                BeginInvoke(new Del_DoCheck_Msg(UpdateMsg), "更新完成!");
                ShowPro(-100);
            }
            catch (Exception ex)
            {
                BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "从[" + urlDownload + "]下载失败: " + ex.Message);
            }
        }

        //读取文件中的文本
        private string GetSringFromFile(string path)
        {
            StreamReader sRead = null;
            try
            {
                if (File.Exists(path))
                {
                    sRead = new StreamReader(path);
                    string result = sRead.ReadLine().Trim();
                    return result;
                }
            }
            catch (Exception e)
            {
                BeginInvoke(new Del_DoCheck_Msg(ShowMsg), "读取文件失败失败: " + e.Message);
            }
            finally
            {
                if (null != sRead)
                {
                    sRead.Close();
                }
            }
            return "";
        }

        private void SetButtonEnabled(bool enabled)
        {
            btnCheck.Enabled = enabled;
            btnUpdate.Enabled = enabled;
        }

        public delegate void Del_DoCheck_Msg(String msg);
        //提示对话框
        private void ShowMsg(string msg)
        {
            lblMsg.Text = msg;
            MessageBox.Show(msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void UpdateMsg(string msg)
        {
            lblMsg.Text = msg;
        }

        public static bool isNull(string str)
        {
            return string.IsNullOrWhiteSpace(str);
        }

        private delegate void ProgressBarShow(int i);
        private void ShowPro(int value)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new ProgressBarShow(ShowPro), value);
            }
            else
            {
                if (value == -100)
                {
                    SetButtonEnabled(true);
                    progressBar1.Value = 0;
                }
                else
                {
                    progressBar1.Value = value;
                }
            }
        }

        public string HttpDownloadFile(string url, string savePath, string saveFileName)
        {

            Directory.CreateDirectory(savePath);//创建目录,有目录了会忽略
            string filePath = savePath + "/" + saveFileName; //保存的文件的绝对路径
            Stream responseStream = null;
            Stream stream = null;
            HttpWebResponse response = null;
            try
            {
                // 设置参数
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                //发送请求并获取相应回应数据
                response = request.GetResponse() as HttpWebResponse;
                long resLength = response.ContentLength; //总大小
                string resType = response.ContentType;
                //直到request.GetResponse()程序才开始向目标网页发送Post请求
                responseStream = response.GetResponseStream();
                //创建本地文件写入流
                stream = new FileStream(filePath, FileMode.Create);
                byte[] bArr = new byte[102400]; //一次读取 100K 
                int size = responseStream.Read(bArr, 0, (int)bArr.Length);  //一次读取 100K 
                long dowLength = 0;  //已经下载的大小
                while (size > 0)
                {
                    stream.Write(bArr, 0, size);
                    size = responseStream.Read(bArr, 0, (int)bArr.Length);  //一次读取 100K 
                    dowLength += size; //已经下载的大小
                    int per = Convert.ToInt32(100 * dowLength / resLength);
                    this.ShowPro(per);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (null != stream)
                {
                    stream.Close();
                }
                if (null != stream)
                {
                    responseStream.Close();
                }
                if (null != response)
                {
                    response.Close();
                }
            }
            return filePath;
        }
    }
}


分享到:
评论

相关推荐

    基于微信小程序的物业缴费系统的设计与实现.zip

    基于微信小程序的物业缴费系统的设计与实现的主要使用者分为服务端和微信端,实现功能包括管理员:首页、个人中心、业主管理、抄表员管理、更新通知管理、公告栏管理、费用类型管理、费用缴纳管理、欠费通知管理、...

    独立版微猫恋爱聊妹术小程序源码带前端多开版

    独立版微猫恋爱聊妹术小程序源码带前端多开版,全新主题、全新UI、全方面支持分享朋友圈功能,全新独立后台大更新,让操作更简单!课堂页面、搜索页面、子话术列表页面等,均增加流量主展示,超多功能。 教程开始 ...

    自助链免费友情链接整站程序( 正式高级功能版 )

    2. 数 据 库:MS Access2003 3. 测试浏览器:腾讯TT浏览器 微软IE浏览器6.0 微软IE浏览器7.0 4. 系统分辨率:1024X768 -------------------------------------------------------------------------- ☆系统前台...

    dezender5PHP解密程序

     黑刀Dezender本身只是个集成工具而已,主程序实际上只是用Delphi开发的GUI界面的外壳程序,核心的解密功能部分来自互联网上的收集整理,我所做的外壳编程,仅是在原有的各个解密内核版本Dezender的功能上,开发...

    java程序是怎么操作数据库的,可以以常用据库为例,求详细解答,最好能举例。

    JDBC技术事实上是一种能通过JAVA语言访问任何结构化数据库的应用程序接口(API)(Sun这样说的,我也不知道是不是真的),而且现在的JDBC 3.0据Sun说也能访问Execel等电子表格程序! JDBC对于数据库的访问有四种方式,...

    超强php程序的反编译工具

     黑刀Dezender本身只是个集成工具而已,主程序实际上只是用Delphi开发的GUI界面的外壳程序,核心的解密功能部分来自互联网上的收集整理,我所做的外壳编程,仅是在原有的各个解密内核版本Dezender的功能上,开发...

    2019年最新版本网址铺吧网址导航源码程序按来路自动排行源码程序下载.rar

    2019年最新版本网址铺吧网址导航源码程序按来路自动排行源码程序下载。简介:【系统开发环境】 演示地址www.wzp8.com 1. 系统环境:MS WINDOWS 2003 +IIS 6.0 2. 数 据 库:MS Access2003 3. 测试浏览器:腾讯TT...

    俄罗斯方块游戏(C语言课设)

    游戏速度分数、更新功能。 3.如有时间,可为程序增加以下功能: 登录模块。该模块在进入主界面之前先执行,用于对进入系统 的用户进行身份验证,若用户输入正确的用户名及用户密码, 则进入主界面,否则输入...

    基于CAPL的CAN控制器Bootloader上位机系统设计_蔡营

    据在线更新功能。通过CANoe软件自带的CAPL语言实现刷机刷写上位机程序设计,提供简单明了的用户操作界面, 能够很好地完成控制器程序的刷写任务。实际测试结果表明,应用CAN网络测试工具及该上位机软件,能够成功刷 ...

    电子教案管理系统ASP源程序

    【关于本系统】程序名称:『电子教案管理系统』(测试版)当前版本号:V1.0 Build 20030720程序制作:刘太祥 【功能介绍】本电子教案管理系统具有专业管理、课程管理、教师管理、教案管理等功能;系统采用结构化的...

    关于ds18b20程序

    * us延时程序 * ********************************************************/ void Delayus(uchar us) { while(us--); //12M,一次6us,加进入退出14us(8M晶振,一次9us) } /********************************...

    深度学习(asp)网址导航系统 3.1.2(最新更新完美版)

    【程序主要功能】 1、全后台化管理,操作简单 2、栏目无限分类,自由添加,排序,设定是否前台显示 3、各大搜索和站内搜索随意切换 4、网站在线提交、审阅、编辑、删除 5、站点相关信息后台动态配置 6、自助网站收录...

    爱图谱购物分享网站程序

    4、新增:后台批量采集时,默认使用淘宝原地址图片(即不抓取图片到本地),可跟据需要进行图片本地化抓取 5、增强:分享内容时可即时在指定分类下创建专辑 6、增强:瀑布流向下拖动时,无须拖动到底部即开始加载...

    数据库管理系统的设计与实----现.pdf

    数据库操纵方面 有DML处理程序、终端查询语言解释程序、数据 存取程序、数据更新程序等。DML处理程序或终端查询语言解释程序 对用户数据操纵请求进行语法、语义检查,由数据存取或更新程序完成 对数据库的存取操作...

    浅析VB程序数据库学生管理系统.doc

    学生管理系统 随着计算机技术的飞速发展,应用范围也越来越广泛,在教学工作中,运用VB程序数 据库学生管理系统可以更方便的对教学信息进行管理,提高工作效率。此外,使用管理 系统软件还具有检索快递,容易查找、...

    首款ChatGPT写的App在苹果商店上架

    有趣的是,据了解这款应用程序的代码几乎完全是由GPT完成的,开发人员只需手动修复了一些小Bug即可。 这展示了GPT技术在应用程序开发中的巨大潜力,可以使开发过程更快、更高效。 SwiftUI上的GPT技术应用,已经成为...

    领智网站系统 v3.0 bate 1

    领智首创的超级标签功能突破原始的定性参数形式,使标签功能真正的动起来,该标签集成SQL语句可直接操作数据库、分页、交替颜色、控制缓存,不受页面和频道的限制,在任何一个页面上都可以运行,可以跟据用户设定的...

Global site tag (gtag.js) - Google Analytics