У меня возникли проблемы с чтением онлайн-файла. Я пытаюсь прочитать, что находится в файле после загрузки во временный файл. Вот мой код:
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.
В вашем коде есть несколько проблем:
tmpFile
прежде чем писать в него.reply->readAll()
вернет данные только один раз. Дальнейшие вызовы вернут пустой массив. Как только вы получили данные, используя readAll
Вы несете ответственность за сохранение его в переменной, если оно понадобится вам позже.seek
переместить указатель на начало файла и прочитать его содержимое.QTextStream
на QNetworkReply
непосредственно читать текст из него. (Может быть, это было только для отладки, я не знаю.)Оказывается, я был глуп и забыл открыть ответ первым. Кроме того, мне не нужно было создавать временный файл. Вот мое решение:
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";
}
}
}