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

功能如下:

1、支持断点续传

2、下载失败自动重试

3、超时等异常处理

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
public class HttpManager
{
const int bytebuff = ;
const int ReadWriteTimeOut = * ;//超时等待时间
const int TimeOutWait = * ;//超时等待时间
const int MaxTryTime = ;
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 = )
{
//打开上次下载的文件
long lStartPos = ;
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 = ;
} HttpWebRequest request = null;
try{
if(size == )
{
size = GetFileContentLength(url);
}
if(size != && size == lStartPos)
{
//下载完成
fs.Close();
return;
} request = (HttpWebRequest)WebRequest.Create(url);
request.ReadWriteTimeout = ReadWriteTimeOut;
request.Timeout = TimeOutWait;
if(lStartPos>)
request.AddRange((int)lStartPos);//设置Range值,断点续传 //向服务器请求,获得服务器回应数据流
WebResponse respone = request.GetResponse();
long totalSize = respone.ContentLength + lStartPos;
long curSize = lStartPos;
progress = (int)(curSize / totalSize *); Stream ns = respone.GetResponseStream(); byte[] nbytes = new byte[bytebuff];
int nReadSize = ;
while(nReadSize > )
{
fs.Write(nbytes, , nReadSize);
nReadSize = ns.Read(nbytes, ,bytebuff); curSize += nReadSize;
//下载进度计算
if (progress < (int)((double)curSize / totalSize * ))
progress = (int)((double)curSize / totalSize * );
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,);
}
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 ;
}
} }

C# http下载(支持断点续传)的更多相关文章

  1. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  2. ASIHTTPRequest下载示例(支持断点续传)

    一.创建网络请求队列 首先,创建网络请求队列,如下: ASINetworkQueue   *que = [[ASINetworkQueue alloc] init]; self.netWorkQueu ...

  3. 打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)

      利用cURL实现单个文件分多段同时下载,支持断点续传(修订版) [复制链接] 摘自 http://bbs.chinaunix.net/thread-917952-1-1.html 在ubuntu下 ...

  4. FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现

    这个就看代码,哈哈哈哈哈  需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...

  5. C#: 实现支持断点续传多线程下载

    /* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)* Reflector 了一下 System.Net.WebClien ...

  6. 转载:Struts2支持断点续传下载实现

    转自:http://blog.sina.com.cn/s/blog_667ac0360102eckm.html package com.ipan.core.controller.web.result; ...

  7. webuploader-异步切片上传(暂不支持断点续传)及 下载方法!C#/.NET

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 进入正题: 关于webuploader,参考网址:https://fex.baidu.com/webuploader/: 本篇博客范例下载地址:ht ...

  8. Java实现多线程下载,支持断点续传

    完整代码:https://github.com/iyuanyb/Downloader 多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内 ...

  9. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

随机推荐

  1. 分治法(一)(zt)

    这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它 ...

  2. jQuery刷新div内容,并对刷新后元素绑定事件。$(document).on()

    给id=zt的元素绑定点击事件 点击刷新id=ps_list中类容(内容中含有id=zt元素) 把zt的点击事件委托到了document上,这样就不用考虑事件是否能绑定到新加元素上 代码如下: $(d ...

  3. webrtc学习(一): webrtc开始

    一. 编译webrtc 1. 预先准备 1)  vpn. 用于同步代码. 这里给一个大概的估计吧. windows端包含vs2013 win8sdk wdk chromium源码等等, 总共需要至少8 ...

  4. InActon-日志分析(KPI)

    我参照的前辈的文章http://blog.fens.me/hadoop-mapreduce-log-kpi/ 从1.x改到了2.x.虽然没什么大改.(说实话,视频没什么看的,看文章最好) 先用mave ...

  5. 【Android 界面效果12】EditText中的多行输入问题

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 我们在使用EditText进行多行输入的时候,通常的写法如下: <EditText android ...

  6. DWZ框架学习

    转自(http://blog.sina.com.cn/s/blog_667ac0360102ec0q.html) 初始化配置文件 $(function(){ DWZ.init("dwz.fr ...

  7. 改变WPF ListBoxItem的选中样式

    想用ListBox作一个类似IOS 设置的菜单,却发现很难改变ListBoxItem鼠标移过.选中的默认蓝色背景与边框. 尝试使用Style来设置strigger,依然不成功.在百度搜索一些资料,提到 ...

  8. Linux 驱动分类 与访问技术

    驱动开发概述 1.驱动分类 1.1 常规分析法 1.1.1  字符设备  字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,  这样的驱动通常实现open, close, read和wri ...

  9. C#--深入分析委托与事件

    本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单. 还将为您解释委托的协变与逆变,以及如何使用 Delegate ...

  10. MVC3 Razor视图引擎的基础语法

    好久没有关注微软的开发了,今天看到了MVC3,顺便学习学习,我觉得Razor是个不错的做法,比使用<%%>简单多了,而且好看.首先“_”开头的cshtml文档将不能在服务器上访问,和asp ...