C#断点续传下载。
断点续传
最近在优化之前的下载流程,仅此篇幅留作笔记之用,日后其他研究此类问题的伙伴可以马上了解原理和开发,减少开发成本。
原理:断点续传目前比较通用的是使用HTTP续传方式,相关的资料可以通过访问:这边简单的说明下--HTTP是(超文本传输协议),而HTTP又是基于TCP/IP协议之上的协议,好了这边我们不需要了解的太深,知道它是超文本传输协议就好了,即维系(服务器Server)和(客户端Client)之间的传输协议;
思路:通过超链接(可以是你的FTP服务器或者任意的可访问地址)下载然后本地文件根目录(最终目标保存)进行保存。中间的方式采用超文本传输协议(HTTP)完成;
1-首先定义一个临时文件格式PERSIST_EXP,用于保存已经下载的临时文件;
/// <summary>
/// temporary file byte
/// </summary>
public static string PERSIST_EXP = ".cdel";
2-更新下载的核心方法;
public void download(string url, string path)
{
if (File.Exists(path))
{
if (MessageBox.Show("文件己存在!是否重新下载?", "Confirm Message", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
{
File.Delete(path);//先删除后重新下载
ResumeDownload(url, path);
}
else
return;
}
else
{
//续传
ResumeDownload(url, path);
}
}
private void ResumeDownload(string url, string path)
{
path = path + PERSIST_EXP;
simpleDownload(url, path);//开始下载
}
3-续传核心方法:使用HttpWebRequest类从客户端发送URL(这个URL就是服务器地址)给服务器请求响应,然后服务器返回一个Request信息。具体的HttpWebRequest介绍可以访问:https://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.aspx。 然后通过WebResponse进行资源的响应获取真正的源信息。接下来就是随心所欲的操作了。
HttpWebRequest request = getWebRequest(url, );
WebResponse response = null;
response = request.GetResponse();
totalLength = response.ContentLength;
Stream reader = response.GetResponseStream();
await Task.Run(() => UpdateProcess(reader, currentLength, writer, totalLength, path, response));//开辟一条新的进程,用于执行任务,主线程直接结束;
4-通过字节逐个读取并写入临时文件;(其中需要注意的是字节reader对象、writer对象、还有响应的response读取完成之后需要清除和释放)
private void UpdateProcess(Stream reader, long currentLength, FileStream writer, long totalLength, string path, WebResponse response)
{ byte[] buff = new byte[];
int c = ; //实际读取的字节数
while ((c = reader.Read(buff, , buff.Length)) > )
{
currentLength += c;
writer.Write(buff, , c);
this.Dispatcher.Invoke(() => progressBar(currentLength, totalLength));//进度条
writer.Flush();
}
close(writer);
if (currentLength == totalLength)
{
File.Move(path, path.Replace(PERSIST_EXP, ""));
MessageBox.Show("下载完成!");
}
if (reader != null)
{
reader.Close();
reader.Dispose();
response.Close();
}
}
5- 还未下载完成然后断开,第二次启动的时候就需要检索当前的字节读取范围以及剩下的字节还有多少需要读取,保证读取的完整性;
request = getWebRequest(url, (int)lStartPos);//设置Range值
writer.Seek(lStartPos, SeekOrigin.Begin);//指针跳转
response = request.GetResponse();
totalLength = response.ContentLength + lStartPos; //总长度
currentLength = lStartPos; //当前长度
C#断点续传下载。的更多相关文章
- ASP.NET WebAPi之断点续传下载(下)
前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把S ...
- ASP.NET WebAPi之断点续传下载(上)
前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有 ...
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...
- iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)
前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄
前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传. 在实际开发中,输入输出流用的比较少,但 ...
- 实现android支持多线程断点续传下载器功能
多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...
- Android实现网络多线程断点续传下载(转)
本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...
- android 多线程断点续传下载
今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...
- Android开发多线程断点续传下载器
使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...
- Android之断点续传下载
今天学习了Android开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节 ...
随机推荐
- github版本控制相关
Git版本控制: 安装Github http://blog.csdn.net/huangyuan_xuan/article/details/49125597 Git本地版本控制 http://blog ...
- 【PAT】B1071 小赌怡情(15 分)
水题一道,直接贴代码 #include<cstdio> #include<string.h> int main(){ //玩家的筹码数.以及 int T,K;scanf(&qu ...
- logstash启动失败的问题追查
在实验中logstash是作为日志过滤器的作用,日志收集使用的则是filebeat组件.redis作为缓存器,logstash从redis中拉取数据进行过滤并传给elasticsearch组件. 但是 ...
- ELK-logstash-6.3.2部署
Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理. 1. logstash部署 [yun@mini04 software]$ p ...
- C++基础算法学习——逆波兰表达式问题
例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 ...
- 联想笔记本Y7000P安装nvidia,cuda,tensorflow,pytorch
Y7000P电脑环境i7处理器,1060显卡,16g内存,win10家庭版(系统版本号1809),在联想官网升级过bios,所有驱动都是最新.(截止时间点2019年3月1日) python3.5 安装 ...
- JavaScript中数组的增删改查以及应用方式
数组的增加方法 1.push()方法向数组中末尾添加一个元素,原数组改变 var arr=[1,2,3,4]; var arr1=arr.push(6); console.log(arr);//打印出 ...
- 17秋 软件工程 团队第五次作业 Alpha Scrum11
17秋 软件工程 团队第五次作业 Alpha Scrum11 今日完成的任务 世强:管理员头像图片上传和显示逻辑处理,活动添加及上传图片: 港晨:完成Web界面前后端对接: 树民:标准化后端接口格式: ...
- IO流_演示键盘录入
读取一个键盘录入的数据,打印到控制台上 键盘本身就是一个标准的输入设备,对于java而言,对于这种输入设备都有相应的对象在System类中 import java.io.IOException; im ...
- 【洛谷】【计数原理+Floyed】P1037 产生数
[题目描述:] 给出一个整数 n \((n<10^{30})\) 和 k 个变换规则\((k≤15)\) . 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如: n=234 .有 ...