zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    Adding iAds to Cocos2d-x on iOS
    让游戏支持复杂手势识别
    【ybtoj高效进阶 21285】独立生物(图论)(博弈论)(DP)
    【ybtoj高效进阶 21286】等差数列(数学)(分类讨论)
    【ybtoj高效进阶 21278】内需消费(线段树)(广义矩阵乘法)(DP)
    【ybtoj高效进阶 21277】逆序对数(数学)(DP)
    【ybtoj高效进阶 21274】相似序列(主席树)(哈希)(二分)
    【ybtoj高效进阶 21273】铲雪问题(树形DP)
    【ybtoj高效进阶 21272】生命游戏(bfs)(二分)
    【ybtoj高效进阶 21270】三只企鹅(树链剖分)(线段树)
  • 原文地址:https://www.cnblogs.com/darkif/p/14179309.html
Copyright © 2011-2022 走看看