分享下项目里面自己封装的一个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. qobject_cast用法

    函数原型: T qobject_cast ( QObject * object ) 本方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0. 在使用时有两 ...

  2. Linux 命令 alternatives和update-alternatives

    参考: http://lionbule.iteye.com/blog/717722 http://manpages.ubuntu.com/manpages/oneiric/man8/update-al ...

  3. Keywords Search

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. DIH中添加不同的数据源

    需求:从mysql数据库中读取一个知识记录,从记录表中的字段值中获取一个文件路径,读取xml文件,xml文件中可能包含多个文档内容.建立索引. xml文件样例: <?xml version=&q ...

  5. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  6. Android小项目之十 应用程序更新的签名问题

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

  7. DPKG命令与软件安装、APT

    ====Linux软件包==== Linux系统中,软件通常以源代码或者预编译包的形式提供. 软件的源代码通常需要编译为二进制代码才可使用,安装比较耗时.用户可以自行调节编译选项,决定需要的功能或组件 ...

  8. 《Cortex-M0权威指南》之体系结构---程序映像和启动流程

    转载请注明来源:cuixiaolei的技术博客 我们先来看看程序映像. 通常,Cortex-M0处理器的程序映像时从地址0x00000000处开始的. 程序映像开始处时向量表,其中包含了异常的其实地址 ...

  9. VMware系统运维(五)安装SSO vCenter Single Sign-On

    1.前面我们做了很多准备工作,安装了很多需求部件,这时候再安装,必备条件无,这是简单安装,即自动安装,点击"安装". 2.简单安装,提示内存不足,需要4GB以上,加内存,重新安装. ...

  10. hdu 3652 打表

    思路:直接打表 #include<cstdio> #include<vector> #include<cmath> #include<iostream> ...