Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FTP-Server abfrage? (https://www.delphipraxis.net/111621-ftp-server-abfrage.html)

Jiro 6. Apr 2008 18:35


FTP-Server abfrage?
 
Hi, ich brauch nen Code, der auf einem von mir eingestellten FTP-Server nach einer Datei sucht und wenn sie da ist, soll das Programm ne Nachricht ausgeben.

katjah 6. Apr 2008 18:52

Re: FTP-Server abfrage?
 
Hi,

schau mal, ob Dir die Indy-Komponenten weiterhelfen.
Da ist ein FTP-Client dabei.

http://www.indyproject.org

Klaus01 6. Apr 2008 18:53

Re: FTP-Server abfrage?
 
Guten Abend,

Du könntest Dur die Funkton Size der Indy FtpKomponente zu nutzen machen:
Zitat:

Zitat von IndyHilfe

Gets file size information from the FTP server.

function Size(const AFileName: String): Integer;

Parameters

const AFileName: String

The file name.

Returns

Integer - Size of the file or -1 when unknown.

Description

Size is an Integer function used to retrieve file size information for the file specified in AFilename from the FTP server.

Grüße
Klaus

Jiro 9. Apr 2008 15:28

Re: FTP-Server abfrage?
 
Also mir fehlt eigentlich nichts mehr, aber ich kann nicht verbinden. Ich habe es einmal hingekriegt aber jetzt gehts nicht mehr. Es kommt diese mit einzelnen Schtitten fortsetzen Meldung. Da drin ist die Meldung res7.worldserver.net (da ist meine HP drauf). Warum kann ich nicht connecten? Habe alle Ports und so richtig eingestellt.

katjah 9. Apr 2008 19:58

Re: FTP-Server abfrage?
 
Hi,

hast Du vielleicht 'ne Firewall laufen, die den Zugriff verhindert ?

Klaus01 10. Apr 2008 07:24

Re: FTP-Server abfrage?
 
Zitat:

Zitat von Jiro
Also mir fehlt eigentlich nichts mehr, aber ich kann nicht verbinden. Ich habe es einmal hingekriegt aber jetzt gehts nicht mehr. Es kommt diese mit einzelnen Schtitten fortsetzen Meldung. Da drin ist die Meldung res7.worldserver.net (da ist meine HP drauf). Warum kann ich nicht connecten? Habe alle Ports und so richtig eingestellt.

Was für eine Fehlermeldung/Exception erscheint denn beim Verbindungsaufbau?

Grüße
Klaus

Jiro 10. Apr 2008 13:03

Re: FTP-Server abfrage?
 
http://niklas-nelson.de/programme/latein/connect.jpg

So siehts aus :stupid:

Klaus01 10. Apr 2008 13:11

Re: FTP-Server abfrage?
 
Bekommst Du die Fehlermeldung beim Connect oder wenn Du mit Size eine
nicht existierende Datei abfragst?

Wenn das mit Size so nicht klappt, kannst Du Dir auch mit
idftp1.list(StringList,'*.*',false) eine Dateiliste des aktuellen
Verzeichnisses laden. Diese Liste kannst Du dann nach der Datei durchsuchen.

Grüße
Klaus

Jiro 10. Apr 2008 13:17

Re: FTP-Server abfrage?
 
Das kommt bei size, verbinden kann ich.

Und wie soll ich das genau machen?

http://niklas-nelson.de/programme/latein/size.jpg
so siehts aus :stupid:

Klaus01 10. Apr 2008 13:23

Re: FTP-Server abfrage?
 
In etwa sollte es so gehen:

Delphi-Quellcode:

var
  sl: TStringList;

begin
 ...
 sl := TStringList.create;
 ftp.list(sl,'*.html',false);
 if sl.indexOf('test.html') >= 0 then
   begin
     //Datei vorhanden
   end
 else
   begin
     // Datei nicht vorhanden
   end;
 sl.free;
..
end;
Grüße
Klaus

Jiro 10. Apr 2008 13:39

Re: FTP-Server abfrage?
 
Jetzt hab ich wieder die gleich Fehlermeldung wie oben...

Klaus01 10. Apr 2008 13:46

Re: FTP-Server abfrage?
 
Un wenn Du *.html durch *.* oder *.htm ersetzt?

Delphi-Quellcode:
ftp.list(sl,'*.*',false);

Jiro 10. Apr 2008 13:51

Re: FTP-Server abfrage?
 
immer noch das gleiche (die datei existiert jetzt auch)
also text.html


edit:
Warum funktioniert das eigentlich nicht:
Delphi-Quellcode:
if anderes.Checked AND paenefeld.Text = '' then
?

Naja, das rausfinden ob die Datei da ist, ist wichtiger...

Klaus01 10. Apr 2008 14:17

Re: FTP-Server abfrage?
 
Hallo,

der untenstehen Code funktioniert bei mir ohne Probleme.
Die Datei existiert nicht, es gibt keine Exception wie die Deine.

Ich habe mit einem lokalen FTP Server getestet.

Delphi-Quellcode:
 
  idftp1.Host:='192.168.145.130';
  idftp1.Username:='.....';
  idftp1.Password:='.....';
  idftp1.Connect();
  if idftp1.size('test.htm') >= 0 then
    showMessage('da')
  else
    showMessage('nicht da');
Vielleicht kannst DU noch mit passive Mode testen.
Delphi-Quellcode:
 idftp1.Passive
Mit einem anderen FTP Client kannst Du Dich zum Server verbinden?

zweite Frage:

Delphi-Quellcode:
if anderes.Checked AND (paenefeld.Text = '') then
Grüße
Klaus

Jiro 10. Apr 2008 14:32

Re: FTP-Server abfrage?
 
So sieht der Code jetzt aus:
Delphi-Quellcode:
begin
ftp.ChangeDir('/htdocs');
sl := TStringList.create;
ftp.list(sl,'*.*',false);
if sl.indexOf('test.html') >= 0 then
   begin
     showmessage ('funzt');
   end
else
   begin
     showmessage ('funzt nicht');
   end;
sl.free;
 end;
Soll da noch was geändert werden? Also ich hab mit passiv auf true und false probiert. Klappt nicht. Die Daten sind ja richtig, da ich ja connecten kann. Aber wie muss man den Ordner schreiben? Also nach dem Root kommt der Ordner htdocs (da sind die Dateien drin).

Klaus01 10. Apr 2008 15:11

Re: FTP-Server abfrage?
 
Der Code schaut o.k.
Ich denke aber das schon etwas beim Verbindungsaufbau fehlschlägt.
Du bis dir sicher das die ftp Host Adresse "res7.worldserver.net" lauten muss
und ftp.res7.worldserver.net?

Wie verbindest Du Dich mit einem anderen FTP-Client auf den Server?
Grüße
Klaus

Jiro 10. Apr 2008 15:35

Re: FTP-Server abfrage?
 
Ich hab als Host ja niklas-nelson.de eingegeben, das ist auch beim meinem FTP Client so... und noch ein Problem, was muss ich eingeben, wenn in folgendes machen will
Delphi-Quellcode:
if anderes.Checked AND (paenefeld.Text is NOT = 'paene') AND (paenefeld.Text is NOT = '') then
?

Klaus01 10. Apr 2008 17:45

Re: FTP-Server abfrage?
 
Delphi-Quellcode:
if anderes.Checked AND not (paenefeld.Text = 'paene') AND not (paenefeld.Text = '') then
oder
Delphi-Quellcode:
if anderes.Checked AND (paenefeld.Text <> 'paene') AND (paenefeld.Text <> '') then
zum FTP Problem habe ich dir ein PN geschickt.

Grüße
Klaus

Jiro 11. Apr 2008 14:13

Re: FTP-Server abfrage?
 
Es funktioniert. Danke

Klaus01 11. Apr 2008 14:15

Re: FTP-Server abfrage?
 
...und, woran lag es denn?

Grüße
Klaus

Jiro 11. Apr 2008 14:28

Re: FTP-Server abfrage?
 
Ich hab keeine Ahnung :-D aber hauptsache es klappt. Ich hab jetzt aber erst gemerkt wie viel aufwand das mit dem lateinlernproggi ist :roteyes: :roteyes:

Jiro 11. Apr 2008 18:02

Re: FTP-Server abfrage?
 
Jetzt hab ich diesen Text hier
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
begin
idftp.Host:='niklas-nelson.de';
idftp.Username:='*meinUsername*';
idftp.Password:='*meinPW*';
try
   idftp.Connect();
   idftp.ChangeDir('/htdocs/programme/latein/');
   if idftp.Size('test.html') > 0 then
        begin
     showMessage('Update verfügbar! (auf Version 1.1)');
     ShellExecute(0, 'open', pchar('http://niklas-nelson.de/programme/latein/test.exe'), nil, nil, SW_SHOWNORMAL);
         end
   else
     showMessage('Es gibt momentan kein Update');
   idftp.Disconnect;
except
  on E: EidProtocolReplyError do
    begin
      ShowMessage(e.Message+' ReplyErrorCode: '+IntToStr(e.ReplyErrorCode));
    end;
end;
end;
und ich habe eine test.html mit 280kb auf dem Server angelegt, trotzdem zeigt das Programm kein Update verfügbar. Die Ordener Programme und Latein scheint er nicht zu finden, es kommt aber auch keine Folder not found meldung.

Klaus01 11. Apr 2008 18:26

Re: FTP-Server abfrage?
 
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
begin
  idftp.Host:='niklas-nelson.de';
  idftp.Username:='*meinUsername*';
  idftp.Password:='*meinPW*';
  try
    idftp.Connect();
    idftp.ChangeDir('/htdocs/programme/latein'); // hier mal den letzten / gelöscht

    if idftp.Size('test.html') > 0 then
      begin
        showMessage('Update verfügbar! (auf Version 1.1)');
        ShellExecute(0, 'open', pchar('http://niklas-nelson.de/programme/latein/test.exe'), nil, nil, SW_SHOWNORMAL);
      end
    else
      showMessage('Es gibt momentan kein Update');

    idftp.Disconnect;
 
  except
    on E: EidProtocolReplyError do
      begin
        ShowMessage(e.Message+' ReplyErrorCode: '+IntToStr(e.ReplyErrorCode));
      end;
  end;
end;
Nun, in dem Code scheint mit dem FTP kein Problem zu geben.
Die Exception wird ja nicht ausgelöst.
Nun, eine dumme Frage, Du bist Dir sicher das es die Ordner gibt?
Und darin liegt auch Deine test.html.
Stimmen die die Namen überein (Groß- und Kleinschreibung),
denn der Server wird auf Linux o.ä. laufen.

Bist Du Dir sicher, das Du die exe direkt vom http Server starten kannst?
Ich denke, das wird nicht funktionieren.
Du wirst sie auf Deinen Rechner laden müssen und dann ausführen.

Grüße
Klaus

Jiro 11. Apr 2008 18:32

Re: FTP-Server abfrage?
 
anscheinend funktioniert das exe starten nicht aber er sollte ja trotzdem die nachricht anzeigen.
http://niklas-nelson.de/programme/latein/latein.jpg
Aber wie kann ich das mit dem exe runterladen sonst machen? Das Programm soll ja für alles die das Lateinbuch haben da sein und die exe soll automatisch runtergeladen werden...

Klaus01 11. Apr 2008 19:23

Re: FTP-Server abfrage?
 
Hallo Jiro,

ich habe keine Idee warum Dein Programm die Datei nicht findet.

Die Datei laden kannst Du mit ftp1.get(..).
Grüße
Klaus

Jiro 12. Apr 2008 11:18

Re: FTP-Server abfrage?
 
Gibt es sonst keine Möglichkeit nach einer Datei zu suchen? Und übrigens, das mit dem get funkt nicht.
Ich habe es so gemacht idftp.get ('http://...');
Fehler:
Es gibt keine Überladene Version von Get, die man mit diesen Argumenten aufrufen kann.
edit: Ich hab das mit dem size von 0 auf -1 gesetzt- es funkt....




edit2:
Aber so funktioniert es auch nciht, weil es trotzdem die Meldung anzeigt auch wenn keine datei da ist

Klaus01 12. Apr 2008 11:25

Re: FTP-Server abfrage?
 
Hallo Jiro,

Du könntest Dir eine Liste der Dateien Deines aktuellen Verzeichnisses
auf dem FTP Server geben lassen.
Das geht mit idftp1.list(StringList);

Mit idftp1.get kannst Du nicht die Webadresse angeben.
Nur den Dateinamen plus Pfad wenn Du nicht in dem Verzeichnis
bist wo die Datei liegt.

In der Hilfe zu den Indy Komponeten ist auch ein Beispiel dabei.
Oder ein gutes Tutorial gibt es hier:

Grüße
Klaus

Jiro 12. Apr 2008 11:32

Re: FTP-Server abfrage?
 
Und was soll ich machen nachdem ich die liste geholt habe? hast nochmal nen neuen quelltext?

übrigens, es heißt idftp ubnd nicht idftp1 :stupid: :stupid:

Klaus01 12. Apr 2008 11:38

Re: FTP-Server abfrage?
 
Zitat:

Zitat von Jiro
Und was soll ich machen nachdem ich die liste geholt habe? hast nochmal nen neuen quelltext?

übrigens, es heißt idftp ubnd nicht idftp1 :stupid: :stupid:

Quelltext ist im Beitrag #10

Bei mir heißt die Instanz idftp1, wie sie bei Dir heißt bleibt Dir überlassen.

Grüße
Klaus

Jiro 12. Apr 2008 11:47

Re: FTP-Server abfrage?
 
Gut, jetzt funkts...

Delphi-Quellcode:
 idftp.Get('test.exe');
so funkts auch nicht wieder die überladen meldung.

Jiro 12. Apr 2008 12:50

Re: FTP-Server abfrage?
 
Beitrag kann gelöscht werden.

Jiro 12. Apr 2008 15:06

Re: FTP-Server abfrage?
 
Welche Möglichkeiten eine exe Datei von nem FTP server zu holen gibts noch? mit get steht da immer was mit überladen und normal öffnen klappt auch nicht...

achja, sorry für DoPo

Klaus01 12. Apr 2008 15:12

Re: FTP-Server abfrage?
 
Nun, wenn da etwas mit überladen steht, dann versorgst Du die get Methode
mit den falschen Parametern.

Eine Alternative zu TidFTp.get findest Du hier.

Ansonsten hilft es in der Hilfe nachzuschauen, da würde man
die Aufrufsyntax finden:
Zitat:

Zitat von DelphiHilfe

Retrieves a file using the FTP protocol.

procedure Get(const ASourceFile: string; ADest: TStream); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean); overload;

Parameters
const ASourceFile: string

File name on the FTP server.

ADest: TStream

File name and optional path on the local machine.

Description
This command downloads a file to the FTP server with the name ASourceFile. Setting the AAppend to True causes the TIdFTP to append the file being downloaded to one which exists on the local machine. The file being downloaded could be either a stream (ADest) or a file name (ADestFile) which TIdFTP can create.

Grüße
Klaus

Jiro 13. Apr 2008 10:51

Re: FTP-Server abfrage?
 
Aber irgendwie versteh ich das nicht, da steht doch filename und den hab ich eingegeben. Was brauch ich denn sonst noch? Die andere Methode ist mir zu kompliziert.

Klaus01 13. Apr 2008 12:50

Re: FTP-Server abfrage?
 
Zitat:

Zitat von Jiro
Aber irgendwie versteh ich das nicht, da steht doch filename und den hab ich eingegeben. Was brauch ich denn sonst noch? Die andere Methode ist mir zu kompliziert.

Na, so schwer ist das doch nicht.
Das Tutorial hast Du dir auch schon angeschaut und auch verstanden?

Delphi-Quellcode:
procedure Get(const ASourceFile: string; ADest: TStream); overload;
Wenn Du get so aufrufst, will es als ASourceFile den Dateinamen und als aDest einen Stream, wenn
Du die Datei speichern willst einen TFileStream ansonsten kannst Du auch einen TMemoryStream nehmen.
Delphi-Quellcode:
var
 myFileStream : TFileStream;

myFileStream := TFileStream.create('hier soll die Datei hin und so soll sie heißen',fmcreate);
idftp1.ChangeDir(...);
idftp1.get('test.exe',myFileStream);
myFileStream.free;
Delphi-Quellcode:
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean); overload;
Wenn Du get mit diesen Parametern aufrufst, will es ASourceFile den Dateinamen auf dem FTP Server
aDest als den Dateinamen wie es auf Deinem PC abgespeichert werden soll.
ACanOverWrite ist die Option ob das File auf Deinem PC überschrieben werden kann.
Würde bei Dir so ausschauen:

Delphi-Quellcode:
idftp1.ChangeDir(..);
idftp.get('Test.exe','hier soll die Datei hin und so soll sie heißen',false);
Grüße
Klaus

Jiro 13. Apr 2008 13:26

Re: FTP-Server abfrage?
 
rSo sieht mein Code jetzt aus:
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var
  sl: TStringList;
  stream : TfileStream;

begin
idftp.Host:='niklas-nelson.de';
idftp.Username:='...';
idftp.Password:='...';
idftp.Connect();
idftp.ChangeDir('/htdocs/programme/latein');
sl := TStringList.create;
idftp.list(sl,'*.*',false);
if sl.indexOf('test.html') >= 0 then
   begin
     showmessage ('Es gibt ein Update (Version 1.1)');
      stream.Create('test.exe',fmcreate);
      idftp.Get('test.exe', stream);
     idftp.Disconnect;
     stream.Free;
   end
else
   begin
     showmessage ('Ne Ne, kein Update da');
     idftp.Disconnect;
   end;
sl.free;
end;


procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean); overload; //die Get procedure funktioniert gar nicht. Aber wenn ich den oberen Teil so lasse kommt wieder eine Exception.
begin
idftp.Host:='niklas-nelson.de';
idftp.Username:='...';
idftp.Password:='...';
idftp.connect ();
idftp.ChangeDir('/htdocs/programme/latein');
idftp.get('Test.exe','test.exe',false);
end;
Ich glaube ich hab da was falsch verstanden oder ist das richtig? Das proggi soll ja auch für alle sein, also muss die Datei im ordner gespeichert werden, wo das Programm drin ist und nicht in einem von mir angegebenen Ordner. Sonst gibts ja noch die Möglichkeit rauszufinden wo das Programm drin ist. Geht das auch noch wenn das installiert ist (ich mache dafür ein Setup (mit INNO)

Klaus01 13. Apr 2008 17:39

Re: FTP-Server abfrage?
 
Delphi-Quellcode:
stream.Create('ExtractFilePath(ParamStr(0))+'test.exe',fmcreate);
So wird die test.exe in das Verzeichnis kopiert wo auch die Aplikation installiert wurde.

Eine kleine Anmerkung habe ich noch, Du schließt darauf das ein Update zur Verfügung steht
wenn eine bestimmte Datei auf dem FTP-Server liegt.
Dabei wird nicht überprüft welche Version die Aplikation gerade hat.
Habe ich z.B. 1.1 und das File liegt auf dem Server, dann wird mir
ein Update auf 1.1 angeboten. Die Version habe ich aber schon.


Grüße
Klaus

Jiro 13. Apr 2008 18:21

Re: FTP-Server abfrage?
 
Ich habe mir das so gedacht, dass ich in der aktuellen Version 1.0 nach der Datei plan11.html auf dem Server suche. Und in der Version 1.1 ändere ich es so um, dass das programm nach der Version 1.2 sucht.

Klaus01 14. Apr 2008 08:15

Re: FTP-Server abfrage?
 
Zitat:

Zitat von Jiro
Ich habe mir das so gedacht, dass ich in der aktuellen Version 1.0 nach der Datei plan11.html auf dem Server suche. Und in der Version 1.1 ändere ich es so um, dass das programm nach der Version 1.2 sucht.

Hast Du dann nicht das Problem wenn der User z.B. Version 1.0
und nach einiger zeit nicht auf Version 1.1 updaten will.
Nun kommt die Version 1.2 heraus, der User will nun ein update
durchführen. Die Folge ist, er muß erst ein Update auf 1.1 machen
danach kann er erst ein Update auf 1.2 machen.

Wäre es nicht sinnvoller eine "VersionsInfo.txt" Datei auf dem
FTP-Server zu halten. Hier steht die letzte Version drin.

Der User lädt sich die Datei, schaut hinein und vergleicht
die Versionsnummer mit der Version seines Programms.
Ist seine Versionsnummer kleiner als die auf dem Server
liegende bekommt er den Hinweis auf eine neuere Version
angezeigt.

Grüße
Klaus

Jiro 14. Apr 2008 16:15

Re: FTP-Server abfrage?
 
Gut, wie kann man das realisieren? Wieder mit ftp.get? Und dann in der Datei suchen?
achja:
stream.Create('ExtractFilePath(ParamStr(0))+'test. exe',fmcreate);

Es gibt keine überladene Version von create, die man mit diesen Parametern aufrufen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz