Как открыть скачанный .ехе файл?

111
09 июля 2021, 06:20

Используя библиотеки 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);
}
Answer 1

Он именно что "в оперативе сидит". Нужно вызвать метод readAll и сложить считанный QByteArray на диск.

Гораздо лучше будет сохранять файл по мере его загрузки. Для этого нужно реализовать обработчик сигнала readyRead, в котором дописывать полученные порции к файлу.

Answer 2

Решил проблему:

#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);
}
READ ALSO
В браузере не выводится HTML [закрыт]

В браузере не выводится HTML [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

82
Имя класса CSS3

Имя класса CSS3

Столкнулся с непониманием названий имен классов в CSS3Сейчас смотрю видео с версткой, человек задает имя класса: class = "get-started-btn menu-link"

85
Как запустить метод раз в сутки?

Как запустить метод раз в сутки?

Как сделать чтобы метод Run выполнялся всё время,а метод Run2 раз в суткиИ когда Run2 работает - Run ждёт

85