Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QNetworkAccessManager - определить отсутствие


Автор: loneybibi 15.6.2011, 14:35
Здравствуйте, уважаемые! smile
Вот есть функция скачивания файла с помощью QNetworkAccessManager.
Подскажите пожалуйста как определить существует ли файл на удаленном компьютере и прогресс его загрузки!? 

Еще почему то на линуксе при загрузке файла таким способо (в моем случае DLL библиотеки) она перестает работать .. хотя размер файла совпадает..

Код

    void downloadFileFromUrl(const QString fileName){
        QNetworkAccessManager networkManager;
        QNetworkRequest request;
        request.setUrl(QUrl(fileName));
        QNetworkReply *reply(networkManager.get(QNetworkRequest(request)));
        QEventLoop loop;
        connect(&networkManager,SIGNAL(finished(QNetworkReply*)),&loop,SLOT(quit()));
        loop.exec();
        reply->deleteLater();
        QByteArray buffer;
        buffer=reply->readAll();
        QFile file("text.txt");
        if(file.open(QIODevice::WriteOnly))
        {
            file.write(buffer);
        }



Автор: loneybibi 17.6.2011, 12:20
Подскажите кто знает почему файл(библиотека .so) загруженный на линуксе таким способом может не работать ? происходит ошибка сегментирования ? Как правильно скачать файл или что я не так делаю ? На windows все работает нормально ((( 

Автор: loneybibi 18.6.2011, 07:38
Нашел из за чего была проблема в том что файл не корректно закачивался.

На linux почему то если файл уже существует и мы его перезаписываем то запись файла будет произведена не корректно.

Для текстовых файлов это не критично, по крайней мере изменений не было замечено, а вот динамические библиотеки не работали. 

В итоге перед записью в файл пришлось добавить проверку существует ли он, потом удалять если да и записывать новый. 

В итоге получилось так:
Код

class downloadFileFromUrl:public QObject
{
    Q_OBJECT
    QNetworkAccessManager manager;
    QNetworkReply *reply;

public:
    downloadFileFromUrl(const QUrl &url){
        connect(&manager,SIGNAL(finished(QNetworkReply*)),SLOT(downloadFinished(QNetworkReply*)));
        QNetworkRequest request(url);
        reply=manager.get(request);
    }

    bool writeFileToDisk(const QString &fileName,QIODevice *data)
    {
        QFile file(fileName);
        if(file.exists()){
            file.remove();
        }

        if(file.open(QIODevice::WriteOnly)){
            file.write(data->readAll());
            file.close();
        } else return(false);
        return true;
    }

public slots:
    void downloadFinished(QNetworkReply *reply)
    {
        writeFileToDisk(QFileInfo(reply->url().path()).fileName(),reply);
        reply->deleteLater();
    }

};


С определением существует ли файл на удаленном компьютере тоже разобрался. Проверкой QNetworkReply::error на ошибки. 

С прогрессом загрузки вроде как тоже, нашел функцию у QNetworkReply::downloadProgress(qint64,qint64), но еще не копался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)