如何确定用于读取的QIODevice的总大小?
How can I determine the total size of a QIODevice for read?
我使用的是qt 5.3。
我有一个大的东西写进QIODevice供读取。我想有一个代理来获取数据,同时保持QIODevice中的数据可用于其他事情读取。因此,如果我调用readAll(),我将在代理中获得所有好的内容,但其他阅读器无法获得任何数据。
我想我应该使用peek(),但这似乎需要一个maxsize。我尝试传递size()或bytesAvailable(),但它们没有给我实际的大小。它们返回的缓冲区大小可能是一个奇怪的值3287。但是我的数据有1081530字节那么大。
我怎样才能得到我的QIODevice的真实大小?
编辑:上面提到的QIODevice实际上是QNetworkReply。我想创建一个代理来观察我的程序的请求和响应数据与QWebView访问一些flash游戏。我实现了QNetworkAccessManager子类的createRequest,我想分析的是,我通过finished()捕获了createRequest的回复信号。
Edit2:我注意到这个QIODevice是一个顺序的,所以大小是未知的。但是如何在不清除数据的情况下读取数据呢?
您可以使用QIODevice::seek
,然后再次读取数据
来自seek
文档:
对于随机存取设备,该函数将当前位置设置为Pos,成功时返回true,发生错误时返回false。为顺序设备,默认行为是什么都不做,然后返回假的。
您可以使用Qt直接从QNetworkReply
头提取内容的大小,如下所示:
qlonglong size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
然后在peek
函数中使用该大小,例如:
void DownloadManager::downloadFinished(QNetworkReply *reply)
{
if (!reply->error())
{
bool ok;
qlonglong size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(&ok);
if (ok)
{
QByteArray data = reply->peek(size); //Here lives your data without reset the internal buffer
//Do something
}
else
{
qDebug() << "Could not read the header";
}
}
//If you are ready then delete
reply->deleteLater();
}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 如何确定用于读取的QIODevice的总大小?