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开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节 ...
随机推荐
- LeetCode题解Maximum Binary Tree
1.题目描述 2.分析 找出最大元素,然后分割数组调用. 3.代码 TreeNode* constructMaximumBinaryTree(vector<int>& nums) ...
- CRM原型
https://files.cnblogs.com/files/wcLT/CRM.zip
- JS代码段:返回yyyy-mm-dd hh:mm:ss
最近做项目的时候正好用到,本着能抄就抄的心态去百度搜索现成的代码, 没想到抄下来的好几个都是错的,要么getMonth没有加1,要么10以下的数字前面没有加0, 我真是日了狗了,这次把写好的正确的直接 ...
- [Demo_01] MapReduce 实现密码 Top10 统计
0. 说明 通过 MapReduce 实现密码 Top10 统计 通过两次 MapReduce 实现 1. 流程图 2. 程序编写 密码 Top10 统计代码
- Pair Programming 2
学生-社团匹配程序 项目流程: 1. 分析讨论 2. 分工合作 3. 代码规范 4. 编码实现 5. 模块结合 6. 测试修改 7. 数据样例 8. 心得体会 9. GitHub链接 结对队友:陈文举 ...
- 【学习笔记】cache/buffer
cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到**加快访问速度**的作用.buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 ...
- git命令行解决冲突文件步骤
原文https://blog.csdn.net/zwl18210851801/article/details/79106448 亲测有用,解决git冲突的好办法 方法一(推荐使用): git pull ...
- box-shadow的动效制作
突然发现原来box-shadow的功能很强大,还能做动效,下面整理下box-shadow几个效果 案例1:hover效果 <a href="/app/list">WEB ...
- 洛谷 P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- oracle Lob对象空间回收测试
备注:转自网络 SQL> create table t(time date,text clob);SQL> begin for i in 1 .. 10000 loop insert in ...