首页 > 编程语言 >C#断点续传的实现

C#断点续传的实现

时间:2023-11-12 10:24:24浏览次数:18  
标签:断点续传 sPosition C# fStream null 实现 path responseStream

断点续传的实现方式有很多,下面介绍个依赖本地以下载的文件大小来实现断点续传

public static void HttpDownloadEx(string url,
string path,
bool overwrite,
Action<string, HttpWebResponse> doneCallback = null,
Action<string, string, long, long> downloadingCallback = null)
{

// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

string contentType = response.Headers["Content-Type"];

//断点续传
FileStream fStream = null;
long sPosition = 0;
Stream responseStream = null;

try
{
long totalLength = response.ContentLength;
if (System.IO.File.Exists(path))
{
fStream = System.IO.File.OpenWrite(path);
sPosition = fStream.Length;
if (sPosition == totalLength)
{
doneCallback?.Invoke(path, response); //文件是完整的,直接结束下载任务
return;
}
fStream.Seek(sPosition, SeekOrigin.Current);
}
else
{
fStream = new FileStream(path, FileMode.Create);
sPosition = 0;
}

HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);
if (sPosition > 0)
{
myRequest.AddRange(sPosition); //设置Range值
}

//向服务器请求,获得服务器的回应数据流
responseStream = myRequest.GetResponse().GetResponseStream();

//定义一个字节数据
byte[] btContent = new byte[512];
int intSize = 0;
intSize = responseStream.Read(btContent, 0, 512);
while (intSize > 0)
{
fStream.Write(btContent, 0, intSize);
intSize = responseStream.Read(btContent, 0, 512);
downloadingCallback?.Invoke(path, contentType, totalLength, fStream.Length);
}
}
catch
{//(Exception ex)
throw;
}
finally
{
//关闭流
if (responseStream != null)
{
responseStream.Close();
responseStream.Dispose();
}
if (fStream != null)
{
fStream.Close();
fStream.Dispose();
}
}
}

 

参考文章:http://blog.ncmem.com/wordpress/2023/11/12/c%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e7%9a%84%e5%ae%9e%e7%8e%b0/

欢迎入群一起讨论

 

 

标签:断点续传,sPosition,C#,fStream,null,实现,path,responseStream
From: https://www.cnblogs.com/songsu/p/17826797.html

相关文章

  • CSS3学习笔记引言
    开始我们要来介绍css:CSS(全称为CascadingStyleSheets)是一种用于描述HTML、XML等文档样式的样式语言,它能够定义元素的显示方式,如字体、颜色、布局等。CSS可以把HTML文档的呈现样式和内容分离,使得网页的结构和表现更加清晰明了,并且可以减少重复的代码。有了CSS,我们可以轻松地......
  • CSS3学习笔记-选择器
    在CSS中,选择器是一种指定一个或多个元素的方法。可以根据元素的类型、类、ID、属性等特征来选择元素。CSS3引入了很多新的选择器,让我们可以更加灵活和精准地选择元素。下面介绍一些常用的CSS3选择器:1.元素选择器元素选择器指定元素的标签名称,例如p、h1、ul。p{color:......
  • CSS3学习笔记-字体属性
    在CSS3中,可以使用字体属性来控制网页中文本的样式和排版。以下是常用的字体属性:font-family该属性用于指定网页中的文本所使用的字体。我们可以通过使用通用的字体名称,或者直接使用字体名称,在多个字体之间进行设置。例如:```cssbody{font-family:Arial,Helvetica,sans-......
  • CSS3学习笔记-盒模型
    CSS盒模型是指包含内容(content)、填充(padding)、边框(border)和外边距(margin)几个方面的一个矩形框模型。内容区(content):指元素中显示内容的区域,它的大小由width和height属性决定。填充区(padding):用于控制内容区周围的空白区域或边距,padding属性可以控制填充区的大小。边框(border):位于......
  • CSS3学习笔记-文字特效
    CSS3中提供了许多有趣和实用的文字特效,可以让我们的文本内容更加生动有趣,下面介绍一些常用的文字特效。文本阴影使用text-shadow属性可以为文本添加阴影效果,语法如下:text-shadow:h-shadowv-shadowblur-color;其中,h-shadow和v-shadow是必需的参数,分别表示阴影的水平和垂......
  • 一个操作系统的设计与实现——第14章 文件系统
    文件系统是操作系统的一个重要模块。本章将要实现的是文件系统。14.1什么是文件系统文件系统是操作系统用于管理硬盘,并使硬盘更易于使用的模块。想要管理硬盘,就需要记录硬盘扇区的使用情况,可以使用位图实现这个功能。想要让硬盘更易于使用,就需要一个非常关键的概念:文件。文件......
  • 一个操作系统的设计与实现——第16章 键盘驱动(下)
    我们的操作系统虽然已经实现了键盘驱动,但其功能仅限于在屏幕上打印输入的字符,任务并不能读取到这些字符。本章将要实现读取键盘输入的系统调用。16.1读取键盘输入的原理想要让任务读取到键盘输入,最简单的方法是构造一个数组,当键盘中断发生时,将键盘输入的字符保存在这个数组中。......
  • 一个操作系统的设计与实现——第15章 键盘驱动(上)
    到目前为止,我们的操作系统只能输出而不能输入。本章将要实现的是键盘驱动,其能让我们的操作系统接收键盘输入。15.1键盘驱动的原理当按下键盘上的键时,发生了什么呢?原来,每当按下键盘上的键,键盘都会发起至少一次键盘中断;每当一个键弹起时,键盘又会发起至少一次键盘中断;如果一直按住......
  • 一个操作系统的设计与实现——第17章 系统交互
    操作系统最终是供用户使用的,所以其需要具备与用户交互的能力,交互方式可以是命令行,图形界面,甚至是触摸屏,语音,实体按钮等。本章将要实现的是系统交互。17.1外壳程序我们的操作系统使用的是基于命令行的交互模式。实现此功能的模块被称为外壳(Shell)程序。事实上,上一章的Test.c已经......
  • redis 使用token实现重复提交
    使用Token实现重复提交介绍在Web开发过程中,重复提交是一个常见的问题。为了防止用户多次提交同一请求,我们可以使用Token实现重复提交的校验。本文将介绍如何使用Redis来实现这一功能。流程图flowchartTDA(生成Token)-->B(存储Token至Redis)B-->C(校验Token)......