C++ Qt怎么实现文件分片断点续传下载

云芳吖_3412

云芳吖_3412

2026-10-19

558人浏览

原创

qt中用qnetworkaccessmanager实现分片下载的关键点是:必须手动组合qnetworkrequest与qnetworkreply,通过head请求校验accept-ranges支持,用range头指定字节范围,预分配文件空间后seek+write精准落盘,持久化记录completedranges,控制并发与超时重试,并校验服务端last-modified防止断点失效。

c++ qt怎么实现文件分片断点续传下载

Qt 中用 QNetworkAccessManager 实现分片下载的关键点

Qt 本身不提供原生的断点续传或分片下载封装,必须手动组合 QNetworkRequest、QNetworkReply 和 HTTP Range 头。核心是:每次请求只取文件某一段,且能从上次中断位置继续——这依赖服务端支持 Accept-Ranges: bytes 和正确响应 206 Partial Content。

常见错误是直接用 QNetworkAccessManager::get() 发起全量请求后强行中断,再重发——这样无法复用已下载数据,也不算真正断点续传。

  • 务必先 HEAD 请求目标 URL,检查响应头是否含 Accept-Ranges: bytes,并读取 Content-Length
  • 用 QNetworkRequest::setRawHeader("Range", "bytes=1024-2047") 指定字节范围(注意:Range 值从 0 开始计数)
  • 不要用 QFile::append 写入;必须用 QFile::write() 配合 QFile::seek() 定位到指定偏移写入,否则会覆盖或错位
  • 每个分片应独立管理状态(起始偏移、期望长度、实际写入长度),避免因网络抖动导致局部错乱

如何安全拼接多个分片到一个文件

分片写入不是简单追加,而是按原始文件偏移精准落盘。典型做法是预先创建一个大小为 Content-Length 的空文件(用 QFile::resize()),再逐个分片 seek + write。

容易踩的坑:Windows 下用 QFile::open(..., QIODevice::Append) 后调用 seek() 可能失败;必须用 QIODevice::ReadWrite 模式打开,且确保文件已存在并预分配空间。

  • 创建临时文件时,先 file.open(QIODevice::WriteOnly),file.resize(totalSize),再 file.close()
  • 每个分片下载完成回调中:打开文件(QIODevice::ReadWrite),file.seek(startOffset),file.write(data),立刻 file.flush()
  • 避免用内存缓冲整个分片再写入——大文件下易 OOM;应边接收边 write() 到文件对应位置

断点状态持久化与恢复逻辑怎么设计

程序崩溃或用户关闭后,必须记住哪些分片已完成、哪些失败、当前总进度。不能只靠内存变量,得落地到磁盘。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

推荐用轻量 JSON 文件记录,字段至少包含:url、totalSize、completedRanges(数组,每项为 {start: 0, end: 1023})、lastModified。别用 SQLite 或复杂序列化——增加可靠性负担。

  • 每次成功写入一个分片后,立即更新 JSON 并 QFile::flush() + QFile::close()
  • 启动恢复时,先读 JSON,对比本地文件大小和 completedRanges,跳过已完整写入的区间
  • 注意时间戳校验:如果服务端文件被更新(Last-Modified 变了),原有断点数据可能失效,需清空重下

QNetworkReply 超时、重试、并发控制的实际处理

分片越多,并发请求数越高,越容易触发服务端限流或本地 socket 耗尽。Qt 默认不限制并发,必须自己控。

单纯用 connect(reply, &QNetworkReply::finished, ...) 不足以应对超时或重定向失败——finished() 仅表示连接结束,不保证成功;要同时监听 errorOccurred() 和检查 reply->attribute(QNetworkRequest::HttpStatusCodeAttribute)。

  • 为每个分片 reply 设置独立超时(用 QTimer 单独监控,因为 QNetworkReply 无内置超时)
  • 重试最多 2 次,且指数退避(如第 1 次等 1s,第 2 次等 2s),避免雪崩
  • 限制最大并发分片数(如 3–5 个),用信号槽队列或 QSemaphore 控制,别一股脑发几十个请求
  • 收到 416 Requested Range Not Satisfiable 表示 Range 错误,需重新 HEAD 获取最新 Content-Length

分片下载真正的难点不在 Qt API 调用,而在状态一致性:网络不可靠、磁盘可能满、用户随时取消、服务端策略变更——所有这些都得在单个分片粒度上可验证、可回滚、可对齐。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习