Entwickler-Ecke

Internet / Netzwerk - Gesamten Ordner per FTP downloaden


Listing - Di 26.12.06 22:35
Titel: Gesamten Ordner per FTP downloaden
Hi,
es tut mir leid dass ich euch jetzt noch einmal nerven muss :(
Aber ich habe dazu im ganzen Forum leider nichts gefunden:
Es geht darum per IndyFTP einen gesamten Ordner herunterzuladen
(dieser hat nähmlich weit über 1000 Dateien und Unterordner...)

Ich bin schon soweit, dass ich den Inhalt des Ordners mit http://Ftp.list
herrausbekomme und einzelne Dateien downloaden kann.

Viele Grüße und schöne Feiertage :-)

Applikation:
user defined image


jaenicke - Di 26.12.06 22:47

Wenn du den Inhalt des Ordners hast, wo ist dann das Problem? Ich hatte zunächst gedacht, es wäre das Problem diese Liste zu bekommen.
Dann musst du doch nur mit einer Schleife alle Dateien durchgehen.

user profile iconListing hat folgendes geschrieben:
es tut mir leid dass ich euch jetzt noch einmal nerven muss :(
Das Forum ist ja dafür da, Fragen zu beantworten ;-)


Listing - Di 26.12.06 22:53

user profile iconjaenicke hat folgendes geschrieben:
Wenn du den Inhalt des Ordners hast, wo ist dann das Problem? Ich hatte zunächst gedacht, es wäre das Problem diese Liste zu bekommen.
Dann musst du doch nur mit einer Schleife alle Dateien durchgehen.

user profile iconListing hat folgendes geschrieben:
es tut mir leid dass ich euch jetzt noch einmal nerven muss :(
Das Forum ist ja dafür da, Fragen zu beantworten ;-)


der Inhalt ist "gecrypted" :D

1. Ich kann nicht zwischen Ordnern und normalen Dateien Unterscheiden
2. Der string ist iergendwie [ACCESS] 1 ftp ftp [iergendeine Anzahl an leerzeichen] [SIZE] [TIME] [FILE]
>> Wie kann ich das extrahieren? Ich finde da kein "wiederkehrendes Muster"

Danke schonmal


jaenicke - Di 26.12.06 23:00

Oh, Moment, dann liste mal lieber so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  FolderContents: TIdFTPListItems;
begin
  Self.FTPClient.List(nil);
  FolderContents := Self.FTPClient.DirectoryListing;
  for i := 0 to FolderContents.Count - 1 do
  begin
    FolderContents.Items[i].FileName

Und so weiter, damit kannst du dann ja arbeiten denke ich... ;-)


Andreas L. - Di 26.12.06 23:05

user profile iconListing hat folgendes geschrieben:
user profile iconjaenicke hat folgendes geschrieben:
Wenn du den Inhalt des Ordners hast, wo ist dann das Problem? Ich hatte zunächst gedacht, es wäre das Problem diese Liste zu bekommen.
Dann musst du doch nur mit einer Schleife alle Dateien durchgehen.

user profile iconListing hat folgendes geschrieben:
es tut mir leid dass ich euch jetzt noch einmal nerven muss :(
Das Forum ist ja dafür da, Fragen zu beantworten ;-)


der Inhalt ist "gecrypted" :D

1. Ich kann nicht zwischen Ordnern und normalen Dateien Unterscheiden
2. Der string ist iergendwie [ACCESS] 1 ftp ftp [iergendeine Anzahl an leerzeichen] [SIZE] [TIME] [FILE]
>> Wie kann ich das extrahieren? Ich finde da kein "wiederkehrendes Muster"

Danke schonmal


Ich denke mal das die Abstände keine Leerzeichen sondern ein TAB ist.


Delphi-Quelltext
1:
2:
3:
//#9 = TAB
//TAB finden
pos(#9, DeinString);


Ich würde einfach jeden Tab suchen und alle Zeichen die davor stehen löschen. So erhältst du den lezten String, also den Datei bzw. Ordnername. Ob es ein Ordner oder eine Datei ist kannst du 1. festsellen indem du überprüfst ob eine Dateiendung dabei steht und 2. ob die Datei 0 Byte groß ist.

Ciao,
Andy


jaenicke - Di 26.12.06 23:08

Ach so, gut dass du den Dateityp ansprichst:
Bei meinem Source lässt sich der mit if FolderContents.Items[i].ItemType <> ditDirectory then feststellen...

// EDIT:
Ach so: Ich nehme an, dass du die ganzen zusätzlichen Infos erhälst, weil du beim List Befehl nicht als dritten Parameter (der heißt ja ADetails) False angegeben hast... ;-)
Wenn du da False angibst solltest du IMHO nur die Dateinamen erhalten...


Listing - Di 26.12.06 23:26

user profile iconjaenicke hat folgendes geschrieben:
Self.FTPClient.List(nil);

Wofür steht denn da FTPClient??


jaenicke - Di 26.12.06 23:28

Das ist das TIdFTPClient-Objekt, musst natürlich deinen Variablennamen nehmen ;-)
Da du deinen Quelltext nicht gepostet hast, kann ich den ja nicht wissen... :lol:


Listing - Di 26.12.06 23:38

user profile iconjaenicke hat folgendes geschrieben:
Das ist das TIdFTPClient-Objekt, musst natürlich deinen Variablennamen nehmen ;-)
Da du deinen Quelltext nicht gepostet hast, kann ich den ja nicht wissen... :lol:



Delphi-Quelltext
1:
2:
3:
 idFTP1.List();
    FolderContents := idFTP1.DirectoryListing;
    ShowMessage('There are currently ' + IntToStr(FolderContents.Count) + ' items in the folder!');

Gibt immer aus "There are currently 0 Items in the folder!"

Wenn ich "Self." davorsetze sagt er
[Pascal Fehler] MainForm.pas(47): E2003 Undefinierter Bezeichner: 'idFTP1'

:-/

Moderiert von user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt


jaenicke - Di 26.12.06 23:49

Delphi- statt Zitat-Tags wären schöner ;-). Aber das nur nebenbei.

Das Self brauchst du für eine lokale Variable nicht, das ist schon richtig.
Jedenfalls wirst du wohl das Verzeichnis nicht richtig gesetzt haben...


Listing - Di 26.12.06 23:56

user profile iconjaenicke hat folgendes geschrieben:
Delphi- statt Zitat-Tags wären schöner ;-). Aber das nur nebenbei.

Das Self brauchst du für eine lokale Variable nicht, das ist schon richtig.
Jedenfalls wirst du wohl das Verzeichnis nicht richtig gesetzt haben...

Das verstehe ich jetzt nicht, wieso geht denn dann


Delphi-Quelltext
1:
2:
IdFTP1.List(Slist,'*',false);
und idFTP1.List('*', false);
nicht?

Was soll ich denn mit dem Verzeichnis anderes machen?
Ich kann ja auch ohne Probleme jetzt aus diesem Verzeichnis downloaden

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


jaenicke - Mi 27.12.06 00:00

Hmm, also wenn das Verzeichnis korrekt gesetzt ist, dann verstehe ich das auch nicht. Bei mir hat das Listing dann so funktioniert.


Listing - Mi 27.12.06 01:51

Mein Algorithmus funktioniert jetzt einigerma0en aber wenn ein Ordner in den er downloaden soll
noch nicht existiert gibt mein Programm sofort ein Fehler aus...
Kann ich das iergendwie verhindern?


jaenicke - Mi 27.12.06 01:54

Du kannst ja mit ForceDirectories den Ordner vorher erstellen. ForceDirectories stellt sicher, dass der übergebene Ordner existiert (legt ihn und alle nicht existierenden Oberordner automatisch an).


Listing - Mi 27.12.06 03:37

user profile iconjaenicke hat folgendes geschrieben:
Du kannst ja mit ForceDirectories den Ordner vorher erstellen. ForceDirectories stellt sicher, dass der übergebene Ordner existiert (legt ihn und alle nicht existierenden Oberordner automatisch an).

Hmm ok jetzt geht es endlich,
vielen Dank war nen schweres Teil aber ich bin froh, dass ich es gemacht hab.
Man lernt ja immer dazu.

Nach so langem Coden bin ich jetzt schon nen bisschen Müde :-)

Also gute Nacht @ all und ein spezieller Dank an jaenicke