Qt下载大文件
Qt Downloading large files
我正在尝试为我的应用程序创建一个FileDownloader类,该类与下载大文件兼容,以避免在下载过程中占用大量内存。我编写了以下函数,在下载过程中使用QNetworkReply的readyRead()信号写出文件:
void FileDownloader::writeReady(){
if(file->open(QIODevice::ReadWrite | QIODevice::Append)){
QDataStream fout(file);
fout << reply->readAll();
} else{
qDebug(file->errorString().toLatin1());
}
file->close();
}
问题是,它没有按照预期的方式编写文件,文件被损坏了。然而,如果我使用finished()信号而不是readyRead()信号,它会完美地写出文件(它有一个加4字节大小的错误,但我可以打开文件并完美地读取它的所有内容)。
如何使其与readyRead()信号和大文件兼容?
如果您正在使用writeReady(),您应该改为侦听readReady(!
不确定这是否有帮助,但是,1)file->close()应该在if(file->open()内部,否则关闭它没有意义,2)readAll()可能会返回一个空的QByteArray(),所以我会在将其发送到流之前测试内容,也会避免QDataStream,但只需使用:QByteArray data=reply->readAll(;文件->写入(数据)
QDataStream向QIODevice提供特定于Qt的二进制数据序列化,并用于流式处理的"两侧"(即,使用QDataStream序列化到QIODevice的数据意味着随后使用QDataStream读回处理,最好使用相同版本的二进制协议)。因此,QDataStream将信息添加到它写入的流中,以提供版本控制数据,确保QDataStream的未来版本向后兼容,这就是为什么在将数据写入文件时会看到额外的数据。
在您的情况下,您将希望放弃使用QDataStream,因为您正在将原始二进制数据写入文件。这可以通过删除上面的数据流类来实现,并用直接调用QIODevices的写方法来替换它:
if (file->write(reply->readAll()) == -1) {
// some error occurred
}
您可能还想考虑只打开文件,而不是每次有可用数据时都打开它。我没有硬数字,但每次打开它几乎肯定会有不希望的开销,尤其是当你知道你会向它写入大量数据时。
- 下载URL中的所有文件
- 从 C++ 上的网址下载文件
- 使用 libssh 从 SFTP 服务器下载文件并使用 C++ 将其写入 ofstream?
- 使用 Libcurl 库进行文件下载
- 通过boost asio iostream下载大文件的最快方法是什么?
- 有没有办法使用 mongocxx 驱动程序从 GridFS 集合的文件下载任意范围?
- 为什么URLDownloadToFile()没有下载我的文件
- 使用 Qt 下载公共保管箱文件
- 视觉 无法使用 libcurl c++ 下载文件
- 下载文件到漫游问题
- 使用 libcurl C++将文件下载到 Ubuntu,简单示例不起作用
- 通过HTTPS从POCO StreamCopier获取文件下载进度
- 文件下载出现问题
- C++ 将文件下载到应用数据
- C++ 卷曲文件下载 - 错误检查
- 如何实现文件下载的暂停和恢复功能?
- 文件下载-在文件写入前检查错误
- 文件下载没有扩展套接字编程
- 为文件下载锁定sqlite3 db
- 在网络层区分文件下载和网页请求