[gelöst] nach ftp zu früher zugriff auf file???
[gelöst] nach ftp zu früher zugriff auf file???
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.
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)
(W. Heisenberg)
Ä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));
... 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)
(W. Heisenberg)
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
hier die cpp von MainWindow
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
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)
(W. Heisenberg)
Warum wartest du 5s und prüfst die Datei dann und nicht innerhalb dieses Codes:
Dann kann du dir auch sicher sein, daß die Datei runtergeladen wurde.
Code: Alles auswählen
if (ftp->currentCommand() == QFtp::Get) {
if (error) {
file->close();
file->remove();
} else {
file->close();
}
Kurze Anmerkung:
an der oben genannten Stelle hat es keinen Erfolg.
statt dessen warte ich noch den abort von ftp ab.
So klappt es.
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)
(W. Heisenberg)