如何确定要读取的QIODevice的总大小?

时间:2014-08-05 11:27:19

标签: c++ qt qiodevice

我使用的是qt 5.3。

我有一个很重要的东西写入QIODevice进行阅读。我希望有一个代理来获取数据,同时保持QIODevice中的数据可供其他东西读取。因此,如果我调用readAll(),我会在代理中获得一切好处,但其他读者无法获取任何数据。

我想我应该使用peek(),但这似乎需要一个maxsize。我试图传递size()或bytesAvailable(),但他们没有给我真正的大小。它们可能返回一个奇怪值的缓冲区大小为3287.但是我的数据大到1081530字节。

如何才能获得我的QIODevice的真实尺寸?

编辑:我上面提到的QIODevice实际上是QNetworkReply。我想创建一个代理来观察我的程序的请求和响应数据与QWebView访问一些Flash游戏。我实现了我的QNetworkAccessManager子类的createRequest,我要分析的东西是我通过createRequest的回复的finished()信号捕获的。

Edit2:我注意到这个QIODevice是顺序的,因此大小未知。但如何在不清除数据的情况下读取数据呢?

2 个答案:

答案 0 :(得分:1)

您可以使用QIODevice::seek,然后再次阅读数据 来自seek文件:

  

对于随机访问设备,此功能将当前位置设置为   pos,成功时返回true,如果发生错误则返回false。对于   顺序设备,默认行为是什么都不做并返回   假的。

答案 1 :(得分:0)

您可以使用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();
}