public partial class update : Form
    {
        private WebClient client;
        int downfilenum = 0; //已下载文件数
        int downlistnum = 0;//总下载文件数
        List<string> list;
        private string URl;
        private string fileName;
        private const string applicationFile = "Setup";

public update()
        {
            InitializeComponent();
        }
        //检测网络状态
        [DllImport("wininet.dll")]
        private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);
        private void update_Load(object sender, EventArgs e)
        {
            if (isConnected())
            {
                client = new WebClient();
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
                client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
                client.Proxy = WebRequest.DefaultWebProxy;
                client.Proxy.Credentials = new NetworkCredential();
                updateFile();
            }
            else
            {
                lblMsg.Text = "网络连接异常,请联系管理员处理";
            }
        }
        /// <summary>
        /// 检测网络状态
        /// </summary>
        private bool isConnected()
        {
            int I = 0;
            bool state = InternetGetConnectedState(out I, 0);
            return state;
        }
        /// <summary>
        /// 获取xml文件,判断是否升级
        /// </summary>
        /// <param name="Dir"></param>
        /// <returns></returns>
        private string getSoftUpdate()
        {
            if (!File.Exists(Application.StartupPath + @"\\update.xml"))
            {
                return "nofile";
            }
            DateTime newDateTime;
            try
            {
                SrmUpdate.updateSoapClient s = new SrmUpdate.updateSoapClient();
                newDateTime = Convert.ToDateTime(s.GetSoftUpDateTime());//获取服务器最新更新日期
            }
            catch (Exception)
            {

throw;
            }
            DateTime oldDateTime;
            XmlDocument doc = new XmlDocument();
            doc.Load(Application.StartupPath + @"\\update.xml");
            oldDateTime = Convert.ToDateTime(doc.SelectSingleNode("/AutoUpdate/SoftUpdateTime").Attributes["Date"].Value);
            return newDateTime >= oldDateTime ? "true" : "false";
        }
        /// <summary>
        /// 开始下载文件
        /// </summary>
        private void updateFile()
        {
            //判断系统有无更新,如果需要升级系统,开始下载
            string isUpdate = getSoftUpdate();
            if (isUpdate == "true")
            {
                lblMsg.Text = "检测到版本有更新,准备升级";
                progressBar1.Visible = true;
                startDownload();
            }
            else if (isUpdate == "false")
            {
                lblMsg.Text = "无需更新,直接启动系统";
                runSystem();
            }
            else if (isUpdate == "nofile")
            {
                lblMsg.Text = "缺少系统文件,请您联系管理员处理";
            }
        }
        /// <summary>
        /// 下载完成调用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            downfilenum++;
            if (client != null) { client.CancelAsync(); }
            if (downfilenum < downlistnum) downLoadFile(list[downfilenum].ToString()); //下载剩余的
            if (downfilenum == downlistnum) { init(); } //初始化
        }
        //下载某个文件
        private void downLoadFile(string fileName)
        {
            downLoad(URl + fileName, Application.StartupPath + "\\temp\\" + fileName, true); //异步下载远程文件
        }
        /// <summary>
        /// 下载进度条
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            int a = e.ProgressPercentage;
            progressBar1.Value = a;
            lblMsg.Text = a + "% Downloading... ";
        }
        
        /// <summary>
        /// HTTP下载远程文件并保存本地的函数
        /// </summary>
        private void downLoad(string downAddress, string savePath, Boolean Async)
        {
            DirectoryInfo di = Directory.GetParent(savePath);
            if (!di.Exists) di.Create();

WebClient client = new WebClient();  //再次new 避免WebClient不能I/O并发          
            if (Async)
            { //异步下载
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
                client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
                client.DownloadFileAsync(new Uri(downAddress), savePath);
            }
            else client.DownloadFile(new Uri(downAddress), savePath);
        }
        /// <summary>
        /// 开始下载
        /// </summary>
        private void startDownload()
        {
            SrmUpdate.updateSoapClient ws = new SrmUpdate.updateSoapClient();
            URl = ws.GetSoftUpdateUrl();
            list = ws.GetSoftUpdateFileList();
            downlistnum = list.Count;
            fileName = list[0].Substring(list[0].LastIndexOf("/") + 1, list[0].Length - list[0].LastIndexOf("/") - 1);
            downLoad(URl + list[0], Application.StartupPath + "\\temp\\" + fileName, true);
        }
        private void init()
        {
            string curdir = Application.StartupPath;
            DirectoryInfo theFolder = new DirectoryInfo(curdir + @"\temp");
            if (theFolder.Exists)
            {
                copyDirectory(curdir + @"\temp", curdir);
            }

if (Directory.Exists(curdir + @"\temp\")) Directory.Delete(curdir + @"\temp\", true); //删除临时目录
            runSystem();
        }
        /// <summary>
        /// 复制文件夹中的所有文件到指定文件夹
        /// </summary>
        /// <param name="DirectoryPath">源文件夹路径</param>
        /// <param name="DirAddress">保存路径</param>
        private void copyDirectory(string DirectoryPath, string DirAddress)//复制文件夹,
        {
            if(!Directory.Exists(DirAddress)) Directory.CreateDirectory(DirAddress);
            DirectoryInfo DirectoryArray = new DirectoryInfo(DirectoryPath);
            FileInfo[] Files = DirectoryArray.GetFiles();//获取该文件夹下的文件列表
            DirectoryInfo[] Directorys = DirectoryArray.GetDirectories();//获取该文件夹下的文件夹列表
            foreach (FileInfo theFile in Files)//逐个复制文件     
            {
                //如果临时文件夹下存在与应用程序所在目录下的文件同名的文件,则删除应用程序目录下的文件   
                if (File.Exists(DirAddress + "\\" + Path.GetFileName(theFile.FullName)))
                    File.Delete(DirAddress + "\\" + Path.GetFileName(theFile.FullName));
                //将临时文件夹的文件移到应用程序所在的目录下   
                File.Copy(theFile.FullName, DirAddress + "\\" + Path.GetFileName(theFile.FullName));
            }
            foreach (DirectoryInfo Dir in Directorys)//逐个获取文件夹名称,并递归调用方法本身     
            {
                copyDirectory(DirectoryPath + "\\" + Dir.Name, DirAddress + "\\" + Dir.Name);
            }
        }
        /// <summary>
        /// 启动主程序
        /// </summary>
        private void runSystem()
        {
            //启动安装程序  
            this.lblMsg.Text = "正在启动主程序....";
            System.Diagnostics.Process.Start(Application.StartupPath + @"\SRMClientAppLoader.exe");
            this.Close();
        }
    }

winform自动更新并实现文件的批量异步下载的更多相关文章

  1. winform自动更新程序实现

    一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...

  2. Winform自动更新组件分享

    作者:圣殿骑士 出处:http://www.cnblogs.com/KnightsWarrior/ 关于作者:专注于微软平台项目架构.管理和企业解决方案.自认在面向对象及面向服务领域有一定的造诣,熟悉 ...

  3. VB winform自动更新 笔记

    看网上各种自动更新方法,最后自己找了个比较简单的,在此做个笔记. 服务器上的共享盘里存放生成的可执行文件和XML格式的配置: <?xml version="1.0" enco ...

  4. C# winform自动更新 (附 demo下载)

    随着需求的变化,如果Server每次更新出新的内容,Client都要重新安装的话. 太过于复杂化.  所以自动更新是很有必要的. 一..NET自带的更新方式    以服务器端为主  (自动更新,微软爸 ...

  5. winform自动更新之AutoUpdater.NET

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhaobw831/article/details/82226291使用AutoUpdater.NET ...

  6. [QuickX]xcode运行Quick-cocos2d-x项目时自动更新lua资源文件

    1.项目设置 build settings ->build options ->Scan all source files and Includes = YES 2.加入script (1 ...

  7. Winform(C#.NET)自动更新组件的使用及部分功能实现

    声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的.   而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代 ...

  8. Winform开发框架之通用自动更新模块(转)

    在网络化的环境中,特别是基于互联网发布的Winform程序,程序的自动更新功能是比较重要的操作,这样可以避免挨个给使用者打电话.发信息通知或者发送软件等,要求其对应用程序进行升级.实现程序的自动更新, ...

  9. WinForm应用程序中实现自动更新功能

    WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...

随机推荐

  1. Zabbix监控系统功能及基本使用

    一.Zabbix基本介绍:    zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.它能监视各种网络参数,保证服务器系统的安全运营:并提供柔软的通知机制以让系 ...

  2. Visual Studio 2013 IIS Explorer 停止调试继续访问站点

    升级到2013后,在做调试的时候默认调试服务器是 IIS Explorer,当终止调试的时候再次访问调试站点时已经无法访问了.此时想预览一下感觉很不方便. 为了能够预览可以参考一下配置: Tools  ...

  3. net破解一(反编译,反混淆-剥壳,工具推荐)

    net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...

  4. 默认python2.6切换成python27

    # 安装修改pythonyum -y install python27 python27-devel python -V; python2.6 -V     # 查看当前python版本 这两个应该都 ...

  5. Apache Rewrite 中文详解

    这几天一直在研究Apache的重写规则,虽然网上有很多教程,不过发现大部分都是抄袭一个人的,一点都不全,所以我想写一个简单的易于理解的教程,我学习.htaccess是从目录保护开始的,这个也比较简单, ...

  6. iOS手动管理内存

    虽然iOS已经有了ARC帮你自动管理内存,但在有些项目中必须采用手动的方式,而且在懂得手动管理内存的情况下会是自己的代码更加完善 众所周知,基于手动管理内存的情况下必然涉及到 relese  reta ...

  7. asp.net缓存(转载)

    由于工作的需要,最近对.net缓存做了相关了解和学习.做以下分类: 客户端缓存 第三方的缓存 服务器缓存 客户端缓存 客户端缓存主要是指浏览器帮我们缓存一些页面组件包括脚本,样式,图片等等,由于客户端 ...

  8. cubie两种固定MAC地址的方法

    1.修改 /etc/init.d/networking 配置文件 在(a)代码的后面添加上(b)这段代码 (a)case "$1" in start) :5e #MAC地址可改 2 ...

  9. sqlserver 注释提取工具

    小程序大智慧,sqlserver 注释提取工具 开篇背景 我习惯在写表的创建脚本时将注释直接写在脚本里,比如 ? /*账套*/ CREATE TABLE [dbo].[AccountingBook] ...

  10. T_SQL查询语句(一): 单表查询

    ############################################ 查询语句--SELECT ########################################## ...