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

How can I determine the total size of a QIODevice for read?

本文关键字:QIODevice 用于 读取 何确定      更新时间:2023-10-16

我使用的是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();
}