弹来弹去跑马灯!

c# http 断点续传下载文件并显示进度

"断点续传",顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。 在HTTP协议中,可以在请求报文头中加入Range段(就是 AddRange方法,向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头),来表示客户机希望从何处继续下载。 比如说从第1024字节开始下载
        void dowloadFile() {
            string StrFileName = "d:\\wgscd.zip"; //根据实际情况设置 
            string StrUrl = "https://files.cnblogs.com/files/wgscd/xxx.zip"; //根据实际情况设置
            //打开上次下载的文件或新建文件 
            long lStartPos = 0;
            System.IO.FileStream fs;
            if (System.IO.File.Exists(StrFileName))//另外如果文件已经下载完毕,就不需要再断点续传了,不然请求的range 会不合法会抛出异常。
            {
                fs = System.IO.File.OpenWrite(StrFileName);
                lStartPos = fs.Length;
                fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针 
            }
            else
            {
                fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
                lStartPos = 0;
            }
            //打开网络连接 
            try
            {
                System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
                if (lStartPos > 0){
                    request.AddRange((int)lStartPos); //设置Range值
                }
                System.Net.WebResponse response=request.GetResponse();
                //向服务器请求,获得服务器回应数据流 
                System.IO.Stream ns = response.GetResponseStream();
                long totalSize = response.ContentLength;
                long hasDownSize = 0;
                byte[] nbytes = new byte[512];//521,2048 etc
                int nReadSize = 0;
                nReadSize = ns.Read(nbytes, 0, nbytes.Length);
                while (nReadSize > 0)
                {
                    fs.Write(nbytes, 0, nReadSize);
                    nReadSize = ns.Read(nbytes, 0, 512);
                    hasDownSize += nReadSize;
                    Text = "" + hasDownSize + "/" + totalSize + "   (" + (((double)hasDownSize *100 / totalSize).ToString("0.00") ) + "%)";//显示下载百分比
                    Application.DoEvents();
                }
                fs.Close();
                ns.Close();
                MessageBox.Show("下载完成");
            }
            catch (Exception ex)
            {
                fs.Close();
               MessageBox.Show ("下载过程中出现错误:" + ex.ToString());
            } 
        }
posted @ 2017-10-11 15:59  wgscd  阅读(1466)  评论(0编辑  收藏  举报