C# 带进度条的文件下载

        private long fileLength;
        private long downLength;//已经下载文件大小,外面想用就改成公共属性 
        private static bool stopDown;
        public HttpDownLoad()
        {
            fileLength = 0;
            downLength = 0;
            stopDown = false;
            // 
            //   TODO:   在此处添加构造函数逻辑 
            // 
        }

        ///   <summary> 
        ///   文件下载 
        ///   </summary> 
        ///   <param   name= "url "> 连接 </param> 
        ///   <param   name= "fileName "> 本地保存文件名 </param> 
        ///   <param   name= "progressBar "> 进度条 </param> 
        public void httpDownFile(string url, string fileName, ProgressBar progressBar)
        {
            Label lable = new Label();
            httpDownFile(url, fileName, progressBar, lable);
            lable.Dispose();
        }

        ///   <summary> 
        ///   文件下载 
        ///   </summary> 
        ///   <param   name= "url "> 连接 </param> 
        ///   <param   name= "fileName "> 本地保存文件名 </param> 
        ///   <param   name= "progressBar "> 进度条 </param> 
        ///   <param   name= "label "> 返回已经下载的百分比 </param> 
        public string httpDownFile(string url, string fileName, ProgressBar progressBar, Label label)
        {
            string strState = "No";
            stopDown = false;
            Stream str = null, fs = null;
            try
            {
                //获取下载文件长度 
                fileLength = getDownLength(url);
                downLength = 0;
                if (fileLength > 0)
                {
                    WebClient DownFile = new WebClient();
                    str = DownFile.OpenRead(url);
                    //判断并建立文件 
                    if (createFile(fileName))
                    {
                        byte[] mbyte = new byte[1024];
                        int readL = str.Read(mbyte, 0, 1024);
                        fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
                        //读取流 
                        while (readL != 0)
                        {
                            if (stopDown)
                                break;
                            downLength += readL;//已经下载大小 
                            fs.Write(mbyte, 0, readL);//写文件 
                            readL = str.Read(mbyte, 0, 1024);//读流 
                            progressBar.Value = (int)(downLength * 100 / fileLength);
                            label.Text = progressBar.Value.ToString() + "% ";
                            Application.DoEvents();
                            strState = "OK";
                        }
                        str.Close();
                        fs.Close();
                    }
                }
            }
            catch (Exception)
            {
                if (str != null)
                    str.Close();
                if (fs != null)
                    fs.Close();
            }
            return strState;
        }

        ///   <summary> 
        ///   文件下载 
        ///   </summary> 
        ///   <param   name= "url "> 连接 </param> 
        ///   <param   name= "fileName "> 本地保存文件名 </param> 
        public void httpDownFile(string url, string fileName)
        {
            try
            {
                WebClient DownFile = new WebClient();
                DownFile.DownloadFile(url, fileName);
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message);
            }
        }

        ///   <summary> 
        ///   获取下载文件大小 
        ///   </summary> 
        ///   <param   name= "url "> 连接 </param> 
        ///   <returns> 文件长度 </returns> 
        private long getDownLength(string url)
        {
            try
            {
                WebRequest wrq = WebRequest.Create(url);
                WebResponse wrp = (WebResponse)wrq.GetResponse();
                wrp.Close();
                return wrp.ContentLength;
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message);
                return 0;
            }
        }

        ///   <summary> 
        ///   建立文件(文件如已经存在,删除重建) 
        ///   </summary> 
        ///   <param   name= "fileName "> 文件全名(包括保存目录) </param> 
        ///   <returns> </returns> 
        private bool createFile(string fileName)
        {
            try
            {
                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }
                Stream s = File.Create(fileName);
                s.Close();
                return true;
            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message);
                return false;
            }
        }

        public void downClose()
        {
            stopDown = true;
        }

 

posted on 2012-06-08 10:54  Jarrett.zhou  阅读(1138)  评论(0编辑  收藏  举报