C# 下载文件 断点续传

        /// <summary>
        /// 普通文件下载
        /// </summary>
        /// <param name="URL"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static bool DownloadFile(string URL, string filename)
        {
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URL);
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                Stream netFs = webResponse.GetResponseStream();
                Stream fs = new FileStream(filename,FileMode.Create);
                byte[] by = new byte[1024];
                int osize = netFs.Read(by, 0, (int)by.Length);
                while (osize > 0)
                {
                    fs.Write(by, 0, osize);
                    osize = netFs.Read(by, 0, (int)by.Length);
                }
                fs.Close();
                netFs.Close();
                webResponse.Close();
                webRequest.Abort();
                return true;
            }
            catch (System.Exception e)
            {
                System.Console.WriteLine(e.ToString());
                return false;
            }
        }
 /// <summary>
        /// 断点传输
        /// </summary>
        /// <param name="URL"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static bool DownloadFile2(string URL, string filename)
        {
            StringBuilder progress = new StringBuilder();
            int httpStatusCode = 200;
            //打开上次下载的文件或新建文件 
            long lStartPos = 0;
            FileStream fs;
            if (File.Exists(filename))//另外如果文件已经下载完毕,就不需要再断点续传了,不然请求的range 会不合法会抛出异常。
            {
                fs = File.OpenWrite(filename);
                lStartPos = fs.Length;
                fs.Seek(lStartPos, SeekOrigin.Current); //移动文件流中的当前指针 
            }
            else
            {
                fs = new FileStream(filename, FileMode.Create);
                lStartPos = 0;
            }

            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
                if (lStartPos > 0)
                {
                    request.AddRange((int)lStartPos); //设置Range值
                }
                WebResponse response = request.GetResponse();
                //向服务器请求,获得服务器回应数据流 
                Stream netFs = response.GetResponseStream();
                long totalSize = response.ContentLength;
                Console.WriteLine($"totalsize:{totalSize / 1024 / 1024}MB"); // 从lStartPos位置开始读获得的大小

                long hasDownSize = 0;
                byte[] nbytes = new byte[512];//521,2048 etc
                int nReadSize = 0;
                nReadSize = netFs.Read(nbytes, 0, nbytes.Length);
                while (nReadSize > 0)
                {
                    progress.Clear();
                    fs.Write(nbytes, 0, nReadSize);
                    nReadSize = netFs.Read(nbytes, 0, nbytes.Length);
                    hasDownSize += nReadSize;
                    //progress.Append("("+(((double)hasDownSize * 100 / totalSize).ToString("0.00")) + " %)");
                    //Console.WriteLine(progress);
                }
                fs.Close();
                netFs.Close();
                return true;
            }
            catch (WebException ex)
            {
                var rsp = ex.Response as HttpWebResponse;
                httpStatusCode = (int)rsp.StatusCode;
                fs.Close();

                if (httpStatusCode == 416)  //request.AddRange((int)lStartPos) 超出范围
                {
                    Console.WriteLine("文件均下载完成");
                    return true;
                }
                else
                {
                    Console.WriteLine("下载过程中出现错误:" + ex.ToString());
                    return false;
                }
            }
        }
使用例子:
DownloadFile2("http://localhost//file//Windows Kits.rar", "Windows Kits.rar");
posted @ 2020-12-23 16:21  darkif  阅读(417)  评论(0编辑  收藏  举报