Seite 1 von 1
[gelöst] nach ftp zu früher zugriff auf file???
Verfasst: 18. Dezember 2009 04:11
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.
Verfasst: 18. Dezember 2009 09:14
von upsala
Glaskugel defekt...
Verfasst: 18. Dezember 2009 11:58
von AuE
*upsallaSeineGlaskugelreicht*
Verfasst: 18. Dezember 2009 23:51
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));
Verfasst: 19. Dezember 2009 10:04
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...
Verfasst: 19. Dezember 2009 13:23
von 24dan
Nein... ähhh ich war das nicht nein
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();
}
Verfasst: 19. Dezember 2009 13:50
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.
Verfasst: 19. Dezember 2009 13:54
von 24dan
AH
super
danke
...der Wald mit den Bäumen!

Verfasst: 19. Dezember 2009 16:35
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();
}