在C#中实现文件断点续传的核心思路是:每次下载前先检查本地已存在文件的大小,然后构造带有Range请求头的HTTP请求,只向服务器申请尚未下载的那部分字节,最后将返回的数据追加写入本地文件。这种方式不仅能避免重复传输,还能在程序意外退出后从断点恢复。

一、理解HTTP Range请求头
HTTP协议通过请求头Range来指定获取资源的字节范围。例如Range: bytes=1000-1999表示只取第1000到1999字节。如果服务器支持,会返回状态码206 Partial Content,并在响应头Content-Range中告知总大小。
二、基础实现步骤
1. 获取本地已下载长度
通过File.Exists与FileInfo.Length得到断点位置。
2. 发送带Range的请
使用HttpWebRequest添加AddRange方法,内部就是设置Range头。
3. 追加写入文件
以FileMode.Append打开文件流,把响应流拷贝进去。
三、完整代码示例
下面演示一个最简单的分块续传下载方法:
using System;
using System.IO;
using System.Net;
class ResumeDownloader
{
static void Download(string url, string savePath)
{
long startPos = 0;
if (File.Exists(savePath))
{
startPos = new FileInfo(savePath).Length;
}
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
// 设置从startPos开始到末尾的范围
req.AddRange(startPos);
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
// 服务器不支持续传时会返回200且从头发,这里简单判断
if (resp.StatusCode == HttpStatusCode.PartialContent)
{
Console.WriteLine("服务器支持断点续传,剩余大小:" + resp.ContentLength);
}
else
{
Console.WriteLine("服务器不支持续传,将覆盖重新下载");
startPos = 0;
}
using (FileStream fs = new FileStream(savePath, FileMode.Append, FileAccess.Write))
using (Stream ns = resp.GetResponseStream())
{
byte[] buffer = new byte[8192];
int read;
while ((read = ns.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, read);
}
}
}
Console.WriteLine("下载完成或继续完成");
}
static void Main()
{
// 示例地址,仅作演示
Download("https://ipipp.com/sample.zip", "local.zip");
}
}
四、注意事项
- 并非所有服务器都支持Range,若返回200而不是206,说明不支持,此时追加写会重复数据,应先清空文件。
- 某些动态接口或压缩转发代理会忽略Range,需要实际测试。
- 多线程分块下载可对每个线程设置不同的
AddRange(from, to)区间,最后合并。
五、小结
控制HTTP请求头Range是C#实现断点续传的关键。借助HttpWebRequest.AddRange与FileMode.Append,我们可以轻松写出健壮的续传逻辑,提升大文件下载体验。
C#断点续传HTTP_Range分块下载WebRequest修改时间:2026-07-25 13:12:25