C# 下载文件 断点续传
/// <summary>
/// 普通文件下载
/// </summary>
/// <param name="URL"></param>
/// <param name="filename"></param>
/// <returns></returns>
public static bool DownloadFile(string URL, string filename)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream netFs = webResponse.GetResponseStream();
Stream fs = new FileStream(filename,FileMode.Create);
byte[] by = new byte[1024];
int osize = netFs.Read(by, 0, (int)by.Length);
while (osize > 0)
{
fs.Write(by, 0, osize);
osize = netFs.Read(by, 0, (int)by.Length);
}
fs.Close();
netFs.Close();
webResponse.Close();
webRequest.Abort();
return true;
}
catch (System.Exception e)
{
System.Console.WriteLine(e.ToString());
return false;
}
}
/// <summary>
/// 断点传输
/// </summary>
/// <param name="URL"></param>
/// <param name="filename"></param>
/// <returns></returns>
public static bool DownloadFile2(string URL, string filename)
{
StringBuilder progress = new StringBuilder();
int httpStatusCode = 200;
//打开上次下载的文件或新建文件
long lStartPos = 0;
FileStream fs;
if (File.Exists(filename))//另外如果文件已经下载完毕,就不需要再断点续传了,不然请求的range 会不合法会抛出异常。
{
fs = File.OpenWrite(filename);
lStartPos = fs.Length;
fs.Seek(lStartPos, SeekOrigin.Current); //移动文件流中的当前指针
}
else
{
fs = new FileStream(filename, FileMode.Create);
lStartPos = 0;
} try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
if (lStartPos > 0)
{
request.AddRange((int)lStartPos); //设置Range值
}
WebResponse response = request.GetResponse();
//向服务器请求,获得服务器回应数据流
Stream netFs = response.GetResponseStream();
long totalSize = response.ContentLength;
Console.WriteLine($"totalsize:{totalSize / 1024 / 1024}MB"); // 从lStartPos位置开始读获得的大小 long hasDownSize = 0;
byte[] nbytes = new byte[512];//521,2048 etc
int nReadSize = 0;
nReadSize = netFs.Read(nbytes, 0, nbytes.Length);
while (nReadSize > 0)
{
progress.Clear();
fs.Write(nbytes, 0, nReadSize);
nReadSize = netFs.Read(nbytes, 0, nbytes.Length);
hasDownSize += nReadSize;
//progress.Append("("+(((double)hasDownSize * 100 / totalSize).ToString("0.00")) + " %)");
//Console.WriteLine(progress);
}
fs.Close();
netFs.Close();
return true;
}
catch (WebException ex)
{
var rsp = ex.Response as HttpWebResponse;
httpStatusCode = (int)rsp.StatusCode;
fs.Close(); if (httpStatusCode == 416) //request.AddRange((int)lStartPos) 超出范围
{
Console.WriteLine("文件均下载完成");
return true;
}
else
{
Console.WriteLine("下载过程中出现错误:" + ex.ToString());
return false;
}
}
}
使用例子:
DownloadFile2("http://localhost//file//Windows Kits.rar", "Windows Kits.rar");
C# 下载文件 断点续传的更多相关文章
- AFNetworking 下载文件断点续传操作
一:本示例代码包括: 文件下载,写入指定目录 下载进度,回调Progress; 断点续传,下载暂停,继续操作: 二:本项目 适用于 AFNetworking 1.x 版本 #pragma mark 断 ...
- 【FTP】FTP文件上传下载-支持断点续传
Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄
前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传. 在实际开发中,输入输出流用的比较少,但 ...
- 反射机制及开源框架xUitls的使用,使用HttpUtils通过断点续传下载文件
反射: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性 Java反射机制主要提供下面几种用途: 1•在运行时判断 ...
- 转:Http下载文件类 支技断点续传功能
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...
- java 多线程下载文件并实时计算下载百分比(断点续传)
多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...
- php实现大文件断点续传下载实例
php实现大文件断点续传下载实例,看完你就知道超过100M以上的大文件如何断点传输了,这个功能还是比较经典实用的,毕竟大文件上传功能经常用得到. require_once('download.clas ...
- SecureCRT上传和下载文件
SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...
- HTTP文件断点续传的原理
前几天一个同事跑过来找我说,我们在广告素材视频这块想做断点续传,就是这次某个视频缓存到一半,下次不用重头开始,可以在原来停留得位置开始继续下载.以提供更好的用户体验. 同时说需要我们支持吐素材地址的业 ...
- 每天一个linux命令(26):用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...
随机推荐
- 1. ansible学习总结: 基础模块
copy模块: #传输文件到目标机 ansible -i /kingdee/ansible/host all -m copy -a 'src=/tmp/aaaa.tgz dest=/tmp/aaaa. ...
- 小程序隐藏scroll-view滚动条的方法
在wxss文件上加上 ::-webkit-scrollbar{ width: 0; height: 0; color: transparent; }
- element-ui学习之-------input表单验证【各种情况总结】
1.非必填,正整数 2.非0开头正整数
- 【Pr】如何将音频剪成多段批量导出
如何将音频剪成多段批量导出 需要软件: Pr, Adobe Media Encoder (时间线窗口中) 用剃刀将音频割成多段 (时间线窗口中) 选中音频右键 | 嵌套 | 输入名字 (嵌套快捷键:A ...
- [转]idea 试用30天“无限续费”idea破解
首先打开idea设置 左上角点击file-->setting-->Plugins https://plugins.zhile.io 然后点击 确定 ("OK") 点 ...
- UI工具
sketch figma Adobe Photoshop Adobe Illustrator adobe xd
- 关于ecplipse中的中文都成乱码的问题
这个问题之前也搞死我了,差不多搞了两个下午才搞好 唉,说多了都是泪 时间过的有点久,不是很记得了,不过我这个问题是装fx包之前发生的,后来我是改了jdk版本的所以可能会有些不同 首先,中文会变成乱码主 ...
- 使用windows切换程序窗口时关闭edg浏览器的多个选项卡
关闭edg浏览器切换程序窗口时展示多个选项卡 一.切换程序窗口的方式 当使用电脑打开了多个程序时,可以通过按住快捷键alt+tab(或者使用笔记本的触控屏,三指左右滑动快捷手势)来切换程序窗口. 二. ...
- Twig
{{ dump() }}{{ dump(variable_name) }}List available variables (at top level): {{ dump(_context|keys) ...
- Spark log4j 配置
Spark的ml包提供了非常好用的调参功能,通过ParamGridBuilder构建待选参数(如:logistic regression的regParam),然后数据量小的时候可以用CrossVali ...