PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rudimentärer ftp-client



TheDodger
29-04-2003, 07:09
Ich brauch irgendwie dringend, und eigentlich schon gestern einen rudimentären FTP-Client, den ich unbedingt im Source benötige und der sowohl unter Windows, als auch unter Linux läuft ...
Super, neh?
Meine Versuche, das ganze unter QT hinzubekommen sind eher kläglich gescheitert.

@anda_skoa
QT ist dafür denkbar kontraproduktiv, glaub's mir! :)

arthur
29-04-2003, 08:57
was meinst du denn mit rudimentär ?
also ich benutze für ftp immer libCurl:
http://curl.haxx.se/libcurl/
ist zwar kein fertiger client aber sehr viel mehr muss man
da auch nicht mehr machen.

gruss
Arthur

TheDodger
29-04-2003, 09:12
Original geschrieben von arthur
was meinst du denn mit rudimentär ?

login, cd, get, logout

Ich habe mir gerade mal die lib angesehen ...
hmmm ... naja ... über API Design lässt sich streiten ... :D
in einem C++ Programm würd ich sie IMHO nicht einsetzen ...

arthur
29-04-2003, 10:33
also ich weiss nicht was dich da stört, ist halt C.
dafür ist es eine ausgereifte bibliothek mit so netten sachen wie ssl
oder connection reusing.
du kannst aber gerne ihre c++ wrapper benutzten oder selber
welche schreiben.

gruss Arthur

ps.
ich schreibe c++ programme und nutzte libCurl trozdem :cool:

TheDodger
29-04-2003, 13:45
Original geschrieben von arthur
also ich weiss nicht was dich da stört, ist halt C.

Ja, das sieht man ;)


dafür ist es eine ausgereifte bibliothek mit so netten sachen wie ssl
oder connection reusing.

wenn man es braucht ist es schön, ich brauche es eben nicht.
Eigentlich will ich keine extra lib dazu nhemen ... das bringt schon so genug Probleme, weil es eben OS unabhängig werden soll ...


du kannst aber gerne ihre c++ wrapper benutzten oder selber
welche schreiben.

Einen Wrapper um dem Wrapper?


ich schreibe c++ programme und nutzte libCurl trozdem :cool:

Ich schreibe auch (nur) C++ Programme, aber das was ich gesehen hab, schreckt mich schon ab! :D


[nachtrag]
Das hier sieht sehr vielversprechend aus :ftplib (http://nbpfaus.net/~pfau/ftplib/)
Aber einbinden kann ich das z.Z. witzigerweise nur unter Linux ... der Windows C++ Compiler sträubt sich geradezu hartnäckig ...

arthur
29-04-2003, 14:19
ich hab mir ftplib angeschaut und irgendwie sieht es für mich genauso
nach c wie libcurl , nur etwas primitiv, ist aber egal :)
wenn du wirklich system unabhängig bleiben willst musst du entwender
in java oder mit einem interpreter wie zb. perl oder python deine programme
schreiben.
ansonsten wirst du dich immer selber drum kümmern müssen dass deine
sachen sowohl auf der einen wie auch auf der anderen plattform laufen.
ich bin jedenfalls immer froh wenn dass die bibliothek für mich übernimmt.

gruss
Arthur

TheDodger
29-04-2003, 16:43
Original geschrieben von arthur
ich hab mir ftplib angeschaut und irgendwie sieht es für mich genauso
nach c wie libcurl , nur etwas primitiv, ist aber egal :)

primitiv?
sie beschrängt sich auf das notwenidigste und ist nich so aufgeblasen ... das basst scho ...
Dafür hat sie IMHO eine durchdachtere & besser Dokumentierte API ...


wenn du wirklich system unabhängig bleiben willst musst du entwender
in java oder mit einem interpreter wie zb. perl oder python deine programme
schreiben.

Hör mir auf mir Java ... und Scriptsprachen sind auch nicht 'profesionell' ... jedenfalls für Kunden.
Ich muß ja mein bash-script gedöhns alles nach C++ portieren ...


ansonsten wirst du dich immer selber drum kümmern müssen dass deine
sachen sowohl auf der einen wie auch auf der anderen plattform laufen.
ich bin jedenfalls immer froh wenn dass die bibliothek für mich übernimmt.

Mag auch sein, doch ich will kein lib mitschleifen, von der ich gerade mal 2% benötige ... und dann noch davon abhängig sein ...
Jedenfalls nicht für minimal Projekte ...

anda_skoa
29-04-2003, 17:12
Original geschrieben von TheDodger
Ich brauch irgendwie dringend, und eigentlich schon gestern einen rudimentären FTP-Client, den ich unbedingt im Source benötige und der sowohl unter Windows, als auch unter Linux läuft ...
Super, neh?
Meine Versuche, das ganze unter QT hinzubekommen sind eher kläglich gescheitert.

@anda_skoa
QT ist dafür denkbar kontraproduktiv, glaub's mir! :)

Ich war so frei es nicht zu glauben :)
Hab mal folgendes versucht, klappt bei mir



#include <qapplication.h>
#include <qurloperator.h>
#include <qnetwork.h>

int main(int argc, char** args)
{
QApplication app(argc, args, false);

qInitNetworkProtocols(); // init FTP und HTTP UrlOperators

QUrlOperator* op = new QUrlOperator();
QObject::connect(op, SIGNAL(finished(QNetworkOperation*)),
&app, SLOT(quit()));

op->copy(QString("ftp://user:password@server/pfad/file.ext"),
QString("file:/zielpfad"));

return app.exec();
}


Ciao,
_

arthur
29-04-2003, 17:34
Dafür hat sie IMHO eine durchdachtere & besser Dokumentierte API ...
sagen wir mal lieber es ist protokol unabhängig und damit nicht soo FTP spezifisch
wie du es vielleicht gerne hättest.
ich weiss zwar nicht was für kunden das sind, sorry aber wenn jemand nur auf c++
besteht weil es "professionel" ist der scheint mir selber nicht wirklich professionel
zu sein.
der hauptgrund für die wahl von c++ ist doch meistens die geschwindigkeit, dadurch aber verlängert sich auch die entwicklung im vergleich zu java oder python.

gruss
Arthur

TheDodger
30-04-2003, 13:35
Original geschrieben von anda_skoa
Ich war so frei es nicht zu glauben :)
Hab mal folgendes versucht, klappt bei mir

[...]

Und was passiert, wenn du den Kram in eine extra Klasse packst? :)

TheDodger
30-04-2003, 13:46
Original geschrieben von arthur
sagen wir mal lieber es ist protokol unabhängig und damit nicht soo FTP spezifisch wie du es vielleicht gerne hättest.

Das wird es sein. :-)


ich weiss zwar nicht was für kunden das sind, sorry aber wenn jemand nur auf c++ besteht weil es "professionel" ist der scheint mir selber nicht wirklich professionel zu sein.

Wenn Kunden absoluten Zugriff auf Server haben (Mausschubser OS halt) und ein Perl / Bash / <was-auch-immer-script-basierendes> Script sehen ...


der hauptgrund für die wahl von c++ ist doch meistens die geschwindigkeit,

auch und die Möglichkeit, Manipulationen von DAU's zu verhindern.


dadurch aber verlängert sich auch die entwicklung im vergleich zu java oder python.
Nun, bei mir weniger ... ich müsste mich jetzt erst Phyton auseinandersetzen und Java ist nicht so der bringer ... jedenfalls nicht für mich. Nenn es Voruteil.

Ich hab für C++ einiges an Klassen, was ich ohne Problem weiter benutzen kann und das fördert meine Entwicklungsgeschwindigkeit enorm. :)

In diesem Sinne ist alles Ansichtssache ...

anda_skoa
30-04-2003, 13:54
Original geschrieben von TheDodger
[...]

Und was passiert, wenn du den Kram in eine extra Klasse packst? :)

Bitte sehr, bitte gleich :)



#include <qapplication.h>
#include <qurloperator.h>
#include <qnetwork.h>

class MyFTP : public QObject
{
Q_OBJECT

public:
MyFTP(QObject* parent = 0, const char* name=0) : QObject(parent, name), m_op(0) {
qInitNetworkProtocols();
}

~MyFTP() {};

void download(const QString& url, const QString& to)
{
if (m_op == 0)
{
m_op = new QUrlOperator();
QObject::connect(m_op, SIGNAL(finished(QNetworkOperation*)),
this, SIGNAL(finished()));

}

m_op->copy(url, to);
}

signals:
void finished();

private:
QUrlOperator* m_op;
};

int main(int argc, char** args)
{
QApplication app(argc, args, false);

MyFTP ftp;
QObject::connect(&ftp, SIGNAL(finished()),
&app, SLOT(quit()));

ftp.download(QString("ftp://user:password@server/pfad/datei"),
QString("file:/zielpfad"));

return app.exec();
}

#include "myftp.moc.cpp"


moc File mit
#> moc -o myftp.moc.cpp myftp.cpp
generieren

Ciao,
_

TheDodger
30-04-2003, 14:58
Original geschrieben von anda_skoa
Bitte sehr, bitte gleich :)


hmmmm ...

schnell ... :)

Ich hab das ganze mal grad ausprobiert ... nach den logfiles des FTP-Servers klappt der Download ... nur die Datei taucht ned auf meiner Festplatte auf! :D
Ich schau mal, ob sich das ganze in mein Projekt integrieren kann ... da passiert schließlich noch mehr, ausser dem Download von Dateien ...



moc File mit
#> moc -o myftp.moc.cpp myftp.cpp
generieren

Das überlass ich generell qmake :D :D

anda_skoa
30-04-2003, 15:01
Original geschrieben von TheDodger
Ich hab das ganze mal grad ausprobiert ... nach den logfiles des FTP-Servers klappt der Download ... nur die Datei taucht ned auf meiner Festplatte auf! :D
Ich schau mal, ob sich das ganze in mein Projekt integrieren kann ... da passiert schließlich noch mehr, ausser dem Download von Dateien ...


Vielleicht ist der zweite String kein Verzeichnis. Ich habs mal mit einer Zieldatei probiert, da gings komischerweise nicht.



Das überlass ich generell qmake :D :D

Ja, ich auch :)
War mehr als Hinweis für andere, die das Posting eventuell lesen.

Ciao,
_

TheDodger
30-04-2003, 15:15
Original geschrieben von anda_skoa
Vielleicht ist der zweite String kein Verzeichnis. Ich habs mal mit einer Zieldatei probiert, da gings komischerweise nicht.

nein, daran lag es nicht ... jedenfalls nicht unter windows ... unter linux muß ich das gleich mal testen ...
unter win hab ich ein /tmp verzeichniss und da taucht nix auf ...

Dafür funktioniert es unter Linux ...
Ich leg mi nieda ... :(



Ja, ich auch :)
War mehr als Hinweis für andere, die das Posting eventuell lesen.


:)

anda_skoa
30-04-2003, 15:48
Original geschrieben von TheDodger
nein, daran lag es nicht ... jedenfalls nicht unter windows ... unter linux muß ich das gleich mal testen ...
unter win hab ich ein /tmp verzeichniss und da taucht nix auf ...

Dafür funktioniert es unter Linux ...
Ich leg mi nieda ... :(


Hmm, vielleicht ein Problem mit der Umsetzung von URL auf Laufwerk.
Nachdem es in Windows keine richtige Root im Filesystem gibt, muss man vielleicht den Laufwerksbuchstaben irgendwie reincodieren.

Ciao,
_

TheDodger
30-04-2003, 15:56
Original geschrieben von anda_skoa
Hmm, vielleicht ein Problem mit der Umsetzung von URL auf Laufwerk.
Nachdem es in Windows keine richtige Root im Filesystem gibt, muss man vielleicht den Laufwerksbuchstaben irgendwie reincodieren.

Auch schon probiert:




QString source ="ftp://xxx";
QString destination;
#idef WIN32
destination ="file:\\c:\\tmp\\";
#else
destination="file:/tmp";
#endif

ftp.download( source, destination );

arthur
30-04-2003, 16:01
vielleicht so:


#idef WIN32
destination ="file://c:/tmp/";

ist eher üblich für urls.

gruss
Arthur

anda_skoa
30-04-2003, 16:24
Ich hab auch schon gesehen, dass ein | statt dem Doppelpunkt genommen wurde.
Eventuell könnte man auch probieren, nur den Pfad anzugeben, ohne Protokoll.
Vielleicht generiert er sich dann selbst eine file:/ URI

Ciao,
_

TheDodger
30-04-2003, 16:29
Original geschrieben von arthur
vielleicht so:


#idef WIN32
destination ="file://c:/tmp/";

ist eher üblich für urls.

Kommt aber auf das gleiche hinaus ...

mehlvogel
30-04-2003, 17:22
hab von der qt eigentlich gar keine Ahnung, aber vielleicht einfach mal ohne das "file://" probieren?

TheDodger
01-05-2003, 18:35
Original geschrieben von mehlvogel
hab von der qt eigentlich gar keine Ahnung, aber vielleicht einfach mal ohne das "file://" probieren?
:D
was denkst du, was ich schon getan hab?

So, ich hab jetzt erstmal bis Montag kein Windows zum programmieren (welch ein Glück).
Ich werden den Linux-Part morgen (hoffentlich) fertig machen können und mich Montag wieder in Richtung Windows bewegen ...

Schönes WE allen!

TheDodger
19-05-2003, 15:39
So ... nach vielen, vielen Tagen ... funktioniert gar nix mehr.

Ich habe die Klasse in mein Programm integriert und da passiert einfach nix.
Mist ... ich suche mal weiter, vielleicht find ich ja noch eine Alternative ... :-(

TheDodger
20-05-2003, 10:29
Also, ich hab jetzt mal anda_skoa's Source genommen und diesen in ein einzelnes Projekt aufgenommen.
Unter Windows wird definitiv die Datei nicht heruntergeladen, obwohl lt. FTP-Server Logfiles die Datei sauber runtergeladen worden sein soll ...
Unter Linux will ich es gleich noch testen, aber da sollte es laufen ...
Ich häng mal den Source unten dran, vielleicht findet jemand von euch einen Fehler?

anda_skoa
20-05-2003, 13:42
Ich kanns vielleicht heute mal in der Firma unter Windows ausprobieren.
Qt3.1.2 glaub ich

Ciao,
_

TheDodger
20-05-2003, 15:18
Ich hab eine Lösung ...
So wie es aussieht klappt das ganze nur, wenn man mit QNetworkOperation den jeweiligen status der einzelnen instanzen abfängt ...

Ich häng meine Lösung (oder das was ich im Netz gefunden hab) mal unten dran.

TheDodger
22-05-2003, 06:32
Und jetzt mal was witziges ...
Das ganze läuft so wie es ist wunderbar als Einzelappliaktion, doch sobald ich das in meinen Sourcecode integriere ... geht gar nix mehr!
Da wird nicht mal ein connect auf den FTP-Server aufgebaut ...

Also manchaml denk ich, ich bin blöd ...

anda_skoa
22-05-2003, 10:29
Hmm.

Vielleicht blockierst du irgendwo die Eventloop.

Ciao,
_

TheDodger
22-05-2003, 12:30
Mal ne dummer frage ... WIE würde ich das tun?

anda_skoa
22-05-2003, 13:43
Zum Beispiel, in dem du einen Arfrur, der aus der Loop kommt (Widget Events, Timer, Socket, etc) mit irgendwas länger beschäftigst, oder der Thread dabei auf einen mutex wartet, etc.

Ciao,
_

TheDodger
23-05-2003, 06:16
Es ist eine pure Consolen-Anwendung, also fallen die Widgets schon mal raus.
Ein an dieser Stelle eingesetztes QProcess wird allerdings anstandslos ausgeführt ...
Und es wäre der erste Einsatz von QUrlOperator / QFtp an diese Stelle ...
Ich weiß auch nicht mehr, woran das liegen könnte! :(