飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

C#自动升级程序:WebClient下载+progressBar进度条

Author:flymorn Source:flymorn
Categories:C#编程 PostTime:2011-4-7 17:40:15
正 文:
    C#利用WebClient下载,并把实时进度展现在progressBar进度条上的一个自动升级程序。飘易说下大概思路:

    首先,文件组成:主程序.exe,Update.exe,Update.xml一共三个文件。

    利用WebClient的异步下载 DownloadFileAsync 来协调 progressBar实时进度条。

    在下载服务器上的 Update.xml 文件时,不需要用 WebClient.DownloadFileAsync 异步下载,因为 Update.xml 配置文件往往很小,没有必要再来显示下进度。flymorn这里做的C#自动升级程序里需要下载的是多个文件,在Update.xml配置文件配置任意几个需要下载的文件地址,所以这里会用到动态数组ArrayList。

-------------------------------------------------
C#代码:

        //全局变量定义
        WebClient client = new WebClient(); //使用WebClient下载
        int downfilenum = 0; int downlistnum = 0;
        ArrayList downlist = new ArrayList();

        private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        { //下载过程中
            int a = e.ProgressPercentage;
            progressBar1.Value = a;
            label1.Text = a + "% Downloading... ";
        }
        private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        { //下载完成时
            downfilenum++;
            if (client != null) { client.CancelAsync(); }
            if (downfilenum < downlistnum) DownLoadFile(downlist[downfilenum].ToString()); //下载剩余的
            if (downfilenum == downlistnum) { init2(); } //继续初始化
        }

        //获取本地的版本信息
        private string GetTheLastUpdateTime(string Dir)
        {省略}

        //获取临时文件里的下载文件地址
        private ArrayList GetDownFileList(string Dir)
        {省略}


        //HTTP下载远程文件并保存本地的函数
        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);
        }

        //下载某个文件
        private void DownLoadFile(string url)
        {
            string curdir = Application.StartupPath;
            string[] arr = url.Split('/');
            string filename = arr[arr.Count() - 1];
            label2.Text = filename;
            DownLoad(url, curdir + @"\temp\" + filename, true); //异步下载远程文件
        }


        //初始化
        private void init()
        {
            string curdir = Application.StartupPath;
            DownLoad("http://www.piaoyi.org/tool/ppproxy/Update.xml", curdir + @"\temp\Update.xml", false); //非异步下载远程文件  
            string thePreUpdateDate = GetTheLastUpdateTime(curdir); //本地版本信息
            string theLastsUpdateDate = GetTheLastUpdateTime(curdir + @"\temp\"); //远程下载本地后的版本信息
            if (thePreUpdateDate == "") thePreUpdateDate = "1990-10-10";

            //比较应用程序的更新日期 
            if (Convert.ToDateTime(thePreUpdateDate) >= Convert.ToDateTime(theLastsUpdateDate))
            {
                MessageBox.Show("当前软件已经是最新的,欢迎使用!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                if (Directory.Exists(curdir + @"\temp\")) Directory.Delete(curdir + @"\temp\", true); //删除临时目录
                this.Close();
            }
            else
            {
                MessageBox.Show("发现新版本,软件即将自动升级...", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                //关闭原有应用程序的所有进程 
                System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("PpProxy");
                foreach (System.Diagnostics.Process pro in proc)
                {
                    pro.Kill();
                }

                downlist = GetDownFileList(curdir + @"\temp"); //获取需要下载的文件列表
                downlistnum = downlist.Count;
                if (downlistnum > 0) DownLoadFile(downlist[0].ToString()); //异步下载第一个
            }
        }

        private void init2()
        {
            string curdir = Application.StartupPath;
            DirectoryInfo theFolder = new DirectoryInfo(curdir + @"\temp");
            if (theFolder.Exists)
            {
                foreach (FileInfo theFile in theFolder.GetFiles())
                {
                    //如果临时文件夹下存在与应用程序所在目录下的文件同名的文件,则删除应用程序目录下的文件   
                    if (File.Exists(curdir + "\\" + Path.GetFileName(theFile.FullName)))
                        File.Delete(curdir + "\\" + Path.GetFileName(theFile.FullName));
                    //将临时文件夹的文件移到应用程序所在的目录下   
                    File.Move(theFile.FullName, curdir + "\\" + Path.GetFileName(theFile.FullName));
                }
            }

            if (Directory.Exists(curdir + @"\temp\")) Directory.Delete(curdir + @"\temp\", true); //删除临时目录

            //启动安装程序  
            this.label1.Text = "正在启动程序....";
            System.Diagnostics.Process.Start(curdir + @"\PpProxy.exe");
            this.Close();
        }


        //
        private void Form1_Load(object sender, EventArgs e)
        {
            init();  //初始化
        }

作者:flymorn
来源:flymorn
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:比尔盖茨不明白Gmail那么大空间干嘛用!
下一篇:C# ProgressBar用法:模拟进度条
9条评论 “C#自动升级程序:WebClient下载+progressBar进度条”
1 开网店卖什么好
2011-4-9 21:39:42
还不错哦,能升级很好
2011-4-10 17:09:48
第一次来,看见那么有用的东西!
2011-4-12 12:35:14
写的非常好。收藏了。呵呵
2011-4-12 16:22:54
来学习学习,谢谢楼主的分享!
2011-4-12 17:15:54
高手啊  网站文章很精彩
2011-4-12 17:52:32
来转转,来看看,谢谢楼主的分享!
2011-5-6 10:23:52
不错,学习学习一下!
8 IM
2012-8-6 15:25:35
程序不错,简单,但是你这程序有个很大的bug:你这里不能讲文件夹移动或者下载:

第一: //下载某个文件
        private void DownLoadFile(string url)
        {
            string curdir = Application.StartupPath;
            string[] arr = url.Split('/');
            string filename = arr[arr.Count() - 1];
            label2.Text = filename;
            DownLoad(url, curdir   @"\temp\"   filename, true); //异步下载远程文件
        }
修改:
  //下载某个文件
        private void DownLoadFile(string url)
        {
            string curdir = Application.StartupPath;        
            string filename = url.Substring(url.IndexOf('/')   1, url.Length - (url.IndexOf('/')   1));         
            DownLoad(url, curdir   @"\temp\"   filename, true); //异步下载远程文件
        }
第二,在 private void init2()
        {}这个函数中,添加:
 foreach (DirectoryInfo theDir in theFolder.GetDirectories())
                {
                    string dirName = theDir.Name;
                    if (Directory.Exists(curdir "\\" dirName))
                    {
                        Directory.Delete(curdir   "\\"   dirName, true);
                    }
                    Directory.Move(theDir.FullName, curdir   "\\"   dirName);
                }
这样程序就完整了
9 xxxxxx
2015-11-4 11:50:52
谢谢了:).........
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2019 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有