Используя библиотеки QNetworkReply и QNetworkAccessManager я скачал .exe файл, но не понимаю как его открыть. Его негде нету. Такое чувство, что он просто в оперативе сидит и как вытащить я не знаю. Может кто подскажет?
Если постоянно скачивать файл, то размер приложения будет расти и не падать.
Исходный код прилагаю
Он очень простой
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
NetworkManager = new QNetworkAccessManager();
process = new QProcess(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::startDownload);
connect(NetworkManager, &QNetworkAccessManager::finished, this, &MainWindow::downloadFinished);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startDownload()
{
QNetworkRequest downloadRequest(QUrl("http://www.eqdrive.com.ua/files/Updates/UpdateEQDriveConfig/UpdaterEQDrive.exe"));
QNetworkReply *reply = NetworkManager->get(downloadRequest);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);
}
void MainWindow::downloadFinished()
{
qDebug("Download Finished");
QFile downloadedFile("UpdaterEQDrive.exe");
if(!downloadedFile.open(QIODevice::ReadOnly))
qDebug() << "Error open file: " + downloadedFile.errorString();
process->start("UpdaterEQDrive.exe");
}
void MainWindow::downloadProgress(qint64 ist, qint64 max)
{
ui->progressBar->setRange(0, max);
ui->progressBar->setValue(ist);
}
Он именно что "в оперативе сидит". Нужно вызвать метод readAll и сложить считанный QByteArray на диск.
Гораздо лучше будет сохранять файл по мере его загрузки. Для этого нужно реализовать обработчик сигнала readyRead, в котором дописывать полученные порции к файлу.
Решил проблему:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
NetworkManager = new QNetworkAccessManager();
process = new QProcess(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::startDownload);
connect(NetworkManager, &QNetworkAccessManager::finished, this, &MainWindow::downloadFinished);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startDownload()
{
QUrl url("http://www.eqdrive.com.ua/files/Updates/UpdateEQDriveConfig/UpdaterEQDrive.exe");
QNetworkRequest downloadRequest;
downloadRequest.setUrl(url);
NetworkManager->get(downloadRequest);
QNetworkReply *reply = NetworkManager->get(downloadRequest);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);
//connect(reply, &QNetworkReply::readyRead, this, &MainWindow::saveDownloadedFile);
}
void MainWindow::downloadFinished(QNetworkReply *reply)
{
if(reply->error())
{
qDebug() << reply->errorString();
} else {
QByteArray downloadedFile = reply->readAll();
QFile *file = new QFile("UpdaterEQDrive.exe");
if(file->open(QFile::WriteOnly))
{
file->write(downloadedFile);
file->close();
qDebug("Download Finished");
process->start("UpdaterEQDrive.exe");
}
}
}
void MainWindow::downloadProgress(qint64 ist, qint64 max)
{
ui->progressBar->setRange(0, max);
ui->progressBar->setValue(ist);
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости