[gelöst] nach ftp zu früher zugriff auf file???

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

[gelöst] nach ftp zu früher zugriff auf file???

Beitrag von 24dan »

Hallo mein file download vom eigenen ftp server klappt.

Problem:
ich möchte nach dem get version.txt den dateiinhalt gleich mit der aktuellen versionsnummer vergleichen. Mir scheint die Datei wird von meinem Programm zu schnell gelesen und ist noch garnicht "gefüllt" mit dem wichtigen Inhalt.
Kann doch eigentlich nicht sein?

1. Ich cancel die ftp Verbindung nach dem done.
2. ich lese die Datei und vergleiche deren Inhalt.
Zuletzt geändert von 24dan am 19. Dezember 2009 16:39, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Glaskugel defekt...
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

*upsallaSeineGlaskugelreicht*
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Ähhh ?
... meine Frage war unverständlich?

Problem:
nach dem Get lass ich den ProgressDialog starten um zu zeigen wie weit der Download fortgeschritten ist.
Dann warte ich auf das done SIGNAL von ftpü und Cancel die ftp verbindung.
Jetzt lese ich direkt im Anschluss die gespeicherte Datei. Und die scheint nicht richtig ausgelesen werden. Der Auslese String ist leer. Wenn ich aber 1-2 sec warte und dann die gleiche Datei lese wird der Inhalt komplett gelesen.

connect(upsala, SIGNAL (Glaskugel_anwerfen), 24dan, SLOT(richtige_loesung_bekommen));
connect(AuE, SIGNAL (Glaskugel_anwerfen), 24dan, SLOT(richtige_loesung_bekommen));
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

So, du hast einen Code geschrieben. Dieser Code hat ein Problem und jetzt schreibst du einen Roman darüber was der Code machen sollte und wir sollen jetzt raten was an dem (unsichtbaren) Code falsch ist...
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Nein... ähhh ich war das nicht nein :oops:

Okay Scherz bei Seite,
hier sind die einzelnen Fkt:
Es ist alles entfernt worden was mit dem Problem nix zu tun hat (lesbarer)
header von MainWindow

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#define def_VERSION "2.0.0.0"

#include <QMainWindow>
#include <QDialog>
#include "ui_mainwindow.h"

QT_BEGIN_NAMESPACE
class QDialogButtonBox;
class QFile;
class QFtp;
class QLabel;
class QProgressDialog;
class QPushButton;
class QUrlInfo;
QT_END_NAMESPACE

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
// damit ich auch von anderen Klassen darauf zugreifen kann?!? (versuch!) 
    QProgressDialog *progressDialog;

private slots:
    void update();
    void versionPruefen();
    void verbindenUndRunterladen(QString);

    void ftpCommandFinished(int, bool);
    void updateDataTransferProgress(qint64 readBytes, qint64 totalBytes);
    void statusFtp();
    void cancelDownload();

private:
    Ui::MainWindow *ui;

    QFtp *ftp;
    QFile *file;
    QString dateiname;

};

#endif // MAINWINDOW_H
hier die cpp von MainWindow

Code: Alles auswählen

#include <QtGui>
#include <QMessageBox>
#include <QtNetwork>
#include <QTimer>

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ftp(0),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    progressDialog = new QProgressDialog(this);
    connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));

    connect(ui->action_ftp, SIGNAL(triggered()), this, SLOT(update()));

    this->dateiname = "version.txt";
    update();
    QTimer::singleShot(5000, this, SLOT(versionPruefen()));
}


/*############################################################
  Name:     update()
  Eingang:  leer
  Ausgang:  leer
  Funktion: Sucht nach Updates für das Programm
#############################################################*/
void MainWindow::update()
{
    QString fileName = this->dateiname;
   verbindenUndRunterladen(fileName);
}



/*############################################################
  Name:     versionPruefen()
  Eingang:  leer
  Ausgang:  leer
  Funktion: Vergleicht aktuelle Version  mit der vom
            Upload Server
#############################################################*/
void MainWindow::versionPruefen()
{   
        QString fileName = this->dateiname;
        QDir dir;
        QString filePath = "";
        filePath = dir.absoluteFilePath(fileName);
        QFile file(filePath);
        if (!file.open(QFile::ReadOnly | QFile::Text)) {
               int dummy = 2;
        }
//laden & vergleichen
        QTextStream in(&file);
        QString server_version = in.readAll();
        if (def_VERSION != server_version){  // Versionsänderungen?
            // Datei für die Install erstellen und speichern
            this->dateiname = "installer_";
            this->dateiname.append(server_version);
            this->dateiname.append(".exe");
        }
}


/*############################################################
  Name:     verbindenUndRunterladen()
  Eingang:  Dateiname die heruntergeladen werden soll
  Ausgang:  leer
  Funktion: datei herunterladen
#############################################################*/
void MainWindow::verbindenUndRunterladen(QString fileName)
{
    if (ftp) {
        ftp->abort();
        ftp->deleteLater();
        ftp = 0;
    }

    ftp = new QFtp(this);
    connect(ftp,SIGNAL(stateChanged(int)),this,SLOT(statusFtp()));
    connect(ftp,SIGNAL(commandFinished(int, bool)),this,SLOT(ftpCommandFinished(int, bool)));
    connect(ftp,SIGNAL(dataTransferProgress(qint64, qint64)),this,SLOT(updateDataTransferProgress(qint64, qint64)));
    connect(ftp,SIGNAL(done(bool)),this,SLOT(cancelDownload()));

    QUrl url("server.net");
    if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp")) {
        ftp->connectToHost(url.toString(), 21);
        ftp->login("user","passwort");
    }
    // herunterladen der Datei
    if (QFile::exists(fileName)) {
        QFile::remove(fileName)
    }
    file = new QFile(fileName);
    if (!file->open(QIODevice::WriteOnly)) {
        delete file;
        return;
    }
    ftp->get(fileName, file);
        progressDialog->setLabelText(tr("Herunterladen von Datei %1...").arg(fileName));
        progressDialog->exec();
}


/*############################################################
  Name:     updateDataTransferProgress()
  Eingang:  leer
  Ausgang:  leer
  Funktion: Update des ProzessBar
#############################################################*/
void MainWindow::updateDataTransferProgress(qint64 readBytes,
                                            qint64 totalBytes){
    progressDialog->setMaximum(totalBytes);
    progressDialog->setValue(readBytes);
}


/*############################################################
  Name:     ftpCommandFinished()
  Eingang:  command identified by id, error is true if an error
            occurred during the processing
  Ausgang:  leer
  Funktion: Verwaltet die Kommandos des FTP Zugangs
#############################################################*/
void MainWindow::ftpCommandFinished(int, bool error)
{
    if (ftp->currentCommand() == QFtp::ConnectToHost) {
        if (error) {
              int dummy = 2;
        }
        return;
    }

    if (ftp->currentCommand() == QFtp::Login) {
        if (error) {
            // Server hat die Verbindung beendet 
            progressDialog->hide();
        }
    }

    if (ftp->currentCommand() == QFtp::Get) {
        if (error) {
            file->close();
            file->remove();
        } else {
            file->close();
        }
        delete file;
        progressDialog->hide();
    }
}


/*############################################################
  Name:     statusFtp()
  Eingang:  leer
  Ausgang:  leer
  Funktion: Informationen über die aktuelle FTP Verbindung
#############################################################*/
void MainWindow::statusFtp()
{
    // der progressDialog wird beendet wenn der download garnicht statt fand
    if (ftp->state()== 0) progressDialog->hide();
}


/*############################################################
  Name:     cancelDownload()
  Eingang:  leer
  Ausgang:  leer
  Funktion: Beenden der FTP Verbindung
#############################################################*/
void MainWindow::cancelDownload()
{
    ftp->abort();
}

"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum wartest du 5s und prüfst die Datei dann und nicht innerhalb dieses Codes:

Code: Alles auswählen

 if (ftp->currentCommand() == QFtp::Get) { 
         if (error) { 
             file->close(); 
             file->remove(); 
         } else { 
             file->close(); 
         } 
Dann kann du dir auch sicher sein, daß die Datei runtergeladen wurde.
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

AH
super
danke

...der Wald mit den Bäumen! :oops:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Kurze Anmerkung:
an der oben genannten Stelle hat es keinen Erfolg.
statt dessen warte ich noch den abort von ftp ab.
So klappt es.

Code: Alles auswählen

/*############################################################
  Name:     cancelDownload()
  Eingang:  leer
  Ausgang:  leer
  Funktion: Beenden der FTP Verbindung
#############################################################*/
void MainWindow::cancelDownload()
{
    ftp->abort();
    status(tr("FTP Verbindung zum Server bewusst geschlossen."));
    versionPruefen();
}
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Antworten