C# http下载(支持断点续传)
分享下项目里面自己封装的一个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下载(支持断点续传)的更多相关文章
- 【FTP】FTP文件上传下载-支持断点续传
Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...
- ASIHTTPRequest下载示例(支持断点续传)
一.创建网络请求队列 首先,创建网络请求队列,如下: ASINetworkQueue *que = [[ASINetworkQueue alloc] init]; self.netWorkQueu ...
- 打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)
利用cURL实现单个文件分多段同时下载,支持断点续传(修订版) [复制链接] 摘自 http://bbs.chinaunix.net/thread-917952-1-1.html 在ubuntu下 ...
- FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现
这个就看代码,哈哈哈哈哈 需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...
- C#: 实现支持断点续传多线程下载
/* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)* Reflector 了一下 System.Net.WebClien ...
- 转载:Struts2支持断点续传下载实现
转自:http://blog.sina.com.cn/s/blog_667ac0360102eckm.html package com.ipan.core.controller.web.result; ...
- webuploader-异步切片上传(暂不支持断点续传)及 下载方法!C#/.NET
十年河东,十年河西,莫欺少年穷 学无止境,精益求精 进入正题: 关于webuploader,参考网址:https://fex.baidu.com/webuploader/: 本篇博客范例下载地址:ht ...
- Java实现多线程下载,支持断点续传
完整代码:https://github.com/iyuanyb/Downloader 多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内 ...
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html ...
随机推荐
- jq实现搜索引擎的提示效果
(function ($) { $.fn.Search = function (options) { var defaults = { inputid: "search", div ...
- 解决faststone capture在台式机上录制屏幕视频没有声音的问题
点击屏幕录像机: 在弹出的屏幕录像机窗口中选择录制音频,然后点击选项按钮: 在弹出的选项按钮中选择视频选项,将所有的多选框都选中,注:最后一个选项录制windows XP的工具提示最好也选上,我发现如 ...
- jquery ajax请求了两次问题
页面有一个请求form: <form method="post" id="signin"> <label for="orderid& ...
- Debian 中添加ppa
在Debian8中默认没有"apt-add-repository"命令,所有也就没法安装ppa. 怎么破? sudo apt-get install software-proper ...
- epoll实现linux进程通信
server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <s ...
- Java各种类型占用的字节数
Java 占用字节数 转自:http://www.blogjava.net/stevenjohn/archive/2013/10/18/405416.html 数据类型 大小(二进制位数) 范围 默认 ...
- 解决ThinkPHP开启APP_DEBUG=>false时报错的问题
最近用ThinkPHP开发一个项目,本地开发测试完成上传到服务器后,第一次打开正常,再刷新页面时就出现 “页面调试错误,无法找开页面,请重试”的错误,我就郁闷啦,明明本地设置define('APP_D ...
- nfa转dfa,正式完成
为了加速转换的处理,我压缩了符号表.具体算法参考任何一本与编译或者自动机相关的书籍. 这里的核心问题是处理传递性闭包,transitive closure,这个我目前采取的是最简单的warshall算 ...
- 转:YUV RGB 常见视频格式解析
转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...
- OpenFlow概述
OpenFlow名称里面虽然包括“Flow”,但其并不是“又一个流程引擎”,我们认为世界上的流程引擎已经足够多了,每个流程引擎都各有千秋,有的甚至免费,所以我们不需要再做一个流程引擎,我们做OpenF ...