0

我在阅读在线文件时遇到了一些问题。在将文件下载到临时文件后,我正在尝试读取文件中的内容。这是我的代码:

void MainWindow::fileIsReady( QNetworkReply * reply)
{
    QTemporaryFile tmpFile;
    tmpFile.write(reply->readAll());

    QByteArray asdf = reply->readAll();
    qDebug() (QString("%1").arg(asdf.length())); // returns 0

    if (tmpFile.open())
    {
        qDebug << "attempting to read file";

        QTextStream stream(&tmpFile);
        QString value = stream.readAll();
        qDebug << value; // value is returning nothing
    }
    else
    {
        qDebug() << "failed to open internet file";
    }
}

// in MainWindow constructor (MainWindow::MainWindow)...


QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileIsReady(QNetworkReply*)) );
manager->get(QNetworkRequest(QUrl("https://www.website.com/stuff/file.exe.md5")));

我将使用它来比较两个 md5 字符串。

4

2 回答 2

1

您的代码中有几个问题:

  1. 您需要tmpFile在写入之前打开它。
  2. reply->readAll()只会返回一次数据。进一步的调用将返回空数组。使用 接收数据readAll后,您有责任将其存储在变量中,以备日后需要时使用。
  3. 在您将某些内容写入文件后,文件指针位于其末尾。您无法从中读取任何内容,因为那里没有数据。您可以使用seek将指针移动到文件的开头并读取其内容。
  4. 在您将数据写入文件后立即从文件中读取是没有意义的。您可以直接使用QTextStreamonQNetworkReply从中读取文本。(也许这只是为了调试,我不知道。)
  5. 很难相信你需要创建一个临时文件来计算 md5。有更简单的方法可以做到这一点。
于 2013-10-16T20:05:50.143 回答
0

原来我很笨,忘了先打开回复。此外,我没有必要创建一个临时文件。这是我的解决方案::

void MainWindow::fileIsReady( QNetworkReply * reply)
{
    if (reply->error() == QNetworkReply::NoError)
    {
        if (reply->open(QIODevice::ReadOnly))
        {
            QByteArray asdf = reply->readAll();

            qDebug() << (QString("asdf %1").arg(asdf.length()));

            qDebug() << (QString(asdf));
        }
        else
        {
            qDebug << "cant open reply";
        }
    }
}
于 2013-10-16T20:11:15.013 回答