Downloader:.NET 下载库,把分块并发和断点续传做到位了
Downloader:.NET 下载库,把分块并发和断点续传做到位了
GitHub 上 1,676 Star。
这是一个 .NET 写的文件下载库,专门解决大文件下载场景下的几个核心问题:速度太慢、中断后要重头下、内存占用不可控。

1、它解决什么问题
用原生 HttpClient 下载大文件,你会碰到一串麻烦事。
服务器支持分块下载,但你得自己发 Range 请求、拼接各块、处理失败重试。下载到一半断网了,要么从头来,要么自己写续传逻辑保存进度。想限速?自己算。想并行?自己管线程。
Downloader 把这些全封装了。你只需要给一个 URL 和保存路径,剩下的事它来干。
2、核心能力
分块并行下载是它的看家本领。把一个文件拆成多块,同时从服务器拉取,速度直接翻倍。默认 8 块、4 并发,够用,也可以根据服务器情况自己调。
断点续传分两种模式。手动模式下,你可以把 DownloadPackage 对象序列化保存,下次启动恢复。自动模式更省事,开启 EnableAutoResumeDownload 后,下载进度直接写进 .download 文件的末尾,程序崩了、电脑断电了,重新调用同一个下载方法就能接着下,不用管序列化的事。
限速也是一行配置的事。设 MaximumBytesPerSecond 就行,比如限制 2MB/s,不会把带宽全吃掉。
内存方面,MaximumMemoryBufferBytes 控制缓冲区上限,不会因为下一个 10GB 的文件就把内存撑爆。

3、怎么用
NuGet 装一下就行:
dotnet add package Downloader
最简的写法,三行代码:
var config = new DownloadConfiguration
{
ChunkCount = 8,
ParallelDownload = true
};
var downloader = new DownloadService(config);
await downloader.DownloadFileTaskAsync(url, filePath);
也可以用 Fluent API,链式调用更直观:
await DownloadBuilder.New()
.WithUrl(url)
.WithDirectory(@"C:\Downloads")
.Build()
.StartAsync();
想监听进度、处理完成事件,照着事件订阅就行。DownloadProgressChanged 给你实时速度和百分比,DownloadFileCompleted 告诉你是成功了还是出错了。
4、自动续传的实现细节
开启 EnableAutoResumeDownload 后,下载过程中会把 DownloadPackage 的状态追加到 .download 文件末尾。文件结构是:前面是实际数据,最后面一小段是元数据。
程序意外退出,.download 文件留在磁盘上。下次再调同样的下载方法,库会检测到这个文件,读出末尾的元数据,验证服务器还支持 Range 请求且文件大小没变,然后从上次的位置继续下。如果验证不过,就重新下。
下载完成后,SetLength 把末尾的元数据截掉,再把 .download 后缀去掉,最终文件干干净净。
5、其他值得注意的点
支持 HttpClient 注入。如果你项目里用了 IHttpClientFactory,可以通过 CustomHttpClientFactory 把现成的 HttpClient 传进去,不用让库自己建连接。
RemoteFileResolver 可以在不下载文件的前提下,通过一次 HEAD 请求拿到远程文件的名字、大小和是否支持 Range 下载。适合在下载列表里先展示文件信息。
跨平台没问题,Windows、Linux、macOS 都能跑。支持 .NET 8、.NET 9、.NET 10,也支持 Native AOT 编译。
没有外部依赖,就一个纯 .NET 库,装进来不会多拉一堆包。
支持 .NET 8、.NET 9、.NET 10,也支持 Native AOT 编译。
没有外部依赖,就一个纯 .NET 库,装进来不会多拉一堆包。
更多推荐

所有评论(0)