C# http下载(支持断点续传)

分享下项目里面自己封装的一个http下载类

功能如下:

1、支持断点续传

2、下载失败自动重试

3、超时等异常处理

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
public class HttpManager
{
    const int bytebuff = 1024;
    const int ReadWriteTimeOut = 2 * 1000;//超时等待时间
    const int TimeOutWait = 5 * 1000;//超时等待时间
    const int MaxTryTime = 12;
    static Dictionary<string,int> TryNumDic = new Dictionary<string,int>();
  
    /// <summary>
    /// 下载文件(同步)  支持断点续传
    /// </summary>
    /// <param name="url">文件url</param>
    /// <param name="savepath">本地保存路径</param>
    /// <param name="progress">下载进度(百分比)</param>
    /// <param name="size">下载文件大小</param>
public static void DowLoadFile(string url,string savepath,ref int progress,long size = 0) { //打开上次下载的文件 long lStartPos = 0; FileStream fs; if(File.Exists(savepath)) { fs = File.OpenWrite(savepath); lStartPos = fs.Length; fs.Seek(lStartPos,SeekOrigin.Current);//移动文件流中的当前指针 } else { string direName = Path.GetDirectoryName(savepath); if(!Directory.Exists(direName))//如果不存在保存文件夹路径,新建文件夹 { Directory.CreateDirectory(direName); } fs = new FileStream(savepath, FileMode.Create); lStartPos = 0; } HttpWebRequest request = null; try{ if(size == 0) { size = GetFileContentLength(url); } if(size != 0 && size == lStartPos) { //下载完成 fs.Close(); return; } request = (HttpWebRequest)WebRequest.Create(url); request.ReadWriteTimeout = ReadWriteTimeOut; request.Timeout = TimeOutWait; if(lStartPos>0) request.AddRange((int)lStartPos);//设置Range值,断点续传 //向服务器请求,获得服务器回应数据流 WebResponse respone = request.GetResponse(); long totalSize = respone.ContentLength + lStartPos; long curSize = lStartPos; progress = (int)(curSize / totalSize *100); Stream ns = respone.GetResponseStream(); byte[] nbytes = new byte[bytebuff]; int nReadSize = 0; while(nReadSize > 0) { fs.Write(nbytes, 0, nReadSize); nReadSize = ns.Read(nbytes, 0 ,bytebuff); curSize += nReadSize; //下载进度计算 if (progress < (int)((double)curSize / totalSize * 100)) progress = (int)((double)curSize / totalSize * 100); fs.Flush(); ns.Close(); fs.Close(); if(curSize!=totalSize)//文件长度不等于下载长度,下载出错 { throw new Exception(); } if(request != null) { request.Abort(); } TryNumDic.Remove(url); } } catch { if(request!=null) { request.Abort(); } fs.Close(); if(TryNumDic.ContainsKey(url)) { if(TryNumDic[url]>MaxTryTime) { TryNumDic.Remove(url); throw new Exception(); } else { TryNumDic[url]++; } } else { TryNumDic.Add(url,1); } DowLoadFile(url, savepath, ref progress, size); } } /// <summary> /// 获取下载文件长度 /// </summary> /// <param name="url"></param> /// <returns></returns> public static long GetFileContentLength(string url) { HttpWebRequest request = null; try { request = (HttpWebRequest)HttpWebRequest.Create(url); request.Timeout = TimeOutWait; request.ReadWriteTimeout = ReadWriteTimeOut; //向服务器请求,获得服务器回应数据流 WebResponse respone = request.GetResponse(); request.Abort(); return respone.ContentLength; } catch(Exception e) { if(request != null) request.Abort(); return 0; } } }

 

转载于:https://www.cnblogs.com/fatlin/p/5207643.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值