打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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; } }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
在asp.net中使用jQuery实现类似QQ网站的图片切割效果
Java Web 文件上传
C# DataSet对象序列化并压缩和反序列化及解压缩
文件转化成二进制以及base64编码字符串返回
python爬虫爬虫,爬取电影榜单
Python网络爬虫小试刀
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服