![]() |
liste alle FTP Daten. hatt noch kleine Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
Da ich alle Daten eines FTP-Servers mit verzeichnissen listen muss und keine kompfortablere lösung gefunden habe, habe ich mir selbst etwas zusammengeschrieben.
Delphi-Quellcode:
Die ersten Verzeichnisse werden richtig gelistet auch die Dateien (nicht auf dem bild) aber irgendwie kommt danach nur kauderwelsch (Sihe Bild) raus.
function how_dirs(laenge: string): integer;
var how_dir1, how_dir2: integer; begin for how_dir1:=0 to length(laenge) do if laenge[how_dir1]= '/' then ergebnis:= ergebnis+1; end; procedure bk; var st: integer; procedure bk2; var s, z, d, dirs, dir: integer; ex2, ex: boolean; begin form1.IdFTP1.List(form1.ListBox2.Items,'',ex); dirs:= ergebnis; ergebnis:= 0; for z:=0 to form1.ListBox2.Count-1 do begin ex2:= true; for d:=0 to length(form1.ListBox2.Items[z]) do if form1.ListBox2.Items[z][d]= '.' then begin form1.ListBox1.AddItem(form1.dir.Text + '/' + form1.ListBox2.Items[z], TObject (form1)); ex2:= false; end; if ex2 then begin form1.ListBox3.AddItem(form1.dir.Text + '/' + form1.ListBox2.Items[z] + '/', TObject (form1)); for dir:=0 to dirs do form1.IdFTP1.ChangeDir('../'); // showmessage(inttostr(dir) + ' ' + inttostr(dirs)); end; end; how_dirs(form1.ListBox3.Items[0]); form1.IdFTP1.ChangeDir(form1.ListBox3.Items[0]); form1.Listbox3.Items.Delete(0); end; begin // for st:=form1.ListBox3.Count-1 to 0 do for st:=0 to 5 do begin bk2; showmessage('toll' + form1.ListBox3.Items[0]); end; end; Ich weis nicht wo der Fehler ist. |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Delphi-Quellcode:
procedure bk;
var st: integer; procedure bk2; var s, z, d, dirs, dir: integer; ex2, ex: boolean; begin form1.IdFTP1.List(form1.ListBox2.Items,'',ex); // ex hat her keinen definierten Wert dirs:= ergebnis; Wenn ex true ist, werden auch sämtliche Details eines Verzeichnisses ausgegeben. Was Du als Kauderwelsch interpretierst, sind die Datei/Verzeichnisrechte und wem diese gehören. Wenn Du ex richtig setzt wirst Du dieses "Kauderwelsch" nicht mehr sehen. Zitat:
Klaus |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Dancke
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Schonmal was von "Rekursion" gehört?
Code:
Prozedur VerzDurchsuchen (Pfad)
Liste den Inhalt des Verzeichnisses Pfad auf - Wenn Eintrag X ein Unterverzeichnis ist - Rufe VerzDurchsuchen (X) auf - Sonst ist es eine Datei ProzedurEnde |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
aber alles nochmal umzuschreiben wehre mir zu aufwendig.
Delphi-Quellcode:
Es funktionirt ja auch alles aber ich habe jetzt volgendes Problem:
procedure bk;
var st: integer; hilf: string; procedure bk2; var s, z, d, dirs, dir2: integer; ex2, ex: boolean; begin ex:= false; form1.IdFTP1.List(form1.ListBox2.Items,'',ex); dirs:= ergebnis; ergebnis:= 0; for z:=0 to form1.ListBox2.Count-1 do begin ex2:= true; for d:=0 to length(form1.ListBox2.Items[z]) do if form1.ListBox2.Items[z][d]= '.' then begin if form1.ListBox3.Items.Count= 0 then begin ref_list; form1.ListBox1.AddItem(form1.dir.text + '/' + form1.ListBox2.Items[z], TObject (form1)); end else begin ref_list; form1.ListBox1.AddItem(form1.ListBox3.Items[0] + form1.ListBox2.Items[z], TObject (form1)); end; ex2:= false; end; if ex2 then begin form1.ListBox3.AddItem(form1.dir.Text + '/' + form1.ListBox2.Items[z] + '/', TObject (form1)); ref_list; for dir2:=0 to dirs do form1.IdFTP1.ChangeDir('../'); // showmessage(inttostr(dir) + ' ' + inttostr(dirs)); end; end; how_dirs(form1.ListBox3.Items[0]); form1.IdFTP1.ChangeDir(form1.ListBox3.Items[0]); form1.Listbox3.Items.Delete(0); ref_list; end; begin // for st:=form1.ListBox3.Count-1 to 0 do for st:=0 to 20 do begin // if form1.ListBox3.Items.Count> 0 // then // hilf:= form1.ListBox3.Items[0]; bk2; ref_list; end; form1.ListBox2.Clear; form1.ListBox3.Clear; end; In wirklichkeit:
Code:
Wird so gelistet:
cms/index.php
downlords/toll.zip dmdownlords/toll2.zip
Code:
Was kann ich dagegen machen?
downlords/index.php
dmdownlords/toll.zip edit: besser gesagt es ist mir nicht zu aufwendig sondern es soll erst mal funktioniren und dann kann ich immernoch was an der geschwindigkeit machen. |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Wenn du es aus Bequemlichkeit nicht nochmal (ordentlich) machen willst, mußt du wohl oder übel rausfinden, wo der Fehler in deiner Logik liegt und ihn beheben?
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
wie fange ich an? besser gesagt kann mir jemand ein codebeispiel für diese "Rekursion" geben? |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Schau in der Codelib. Dort gibt es Codes, die rekursiv Ordner auf der lokalen Festplatte auflisten. Dürfte kein Problem sein, dass für FTP umzubauen.
Noch eine Bitte: Lies, vor dem Absenden, Deinen Post durch und korrigiere Deine Rechtschreibfehler... |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Doch, kann sie.
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
Ich hab jetzt mal angefangen:
Delphi-Quellcode:
Ich komme aber irgendwie nicht weiter.
procedure list(inhalt: string);
var strlist: tstringlist; ver_merk: string; ex, dir_ja, dir_nein: boolean; sl,z,d: integer; begin form1.IdFTP1.List(form1.ListBox2.Items,'',false); for z:=0 to form1.ListBox2.Count-1 do begin for sl:=0 to length(form1.ListBox2.Items[z]) do if form1.ListBox2.Items[z][sl]= '/' then form1.IdFTP1.ChangeDirUp; for d:=0 to length(form1.ListBox2.Items[z]) do begin dir_ja:= false; dir_nein:= true; if form1.ListBox2.Items[z][d]= '.' then begin dir_ja:= true; dir_nein:= false; end; end; if dir_nein then begin ver_merk:= ver_merk + form1.ListBox2.Items[z] + '/'; list(form1.ListBox2.Items[z]); end; if dir_ja then begin form1.ListBox1.AddItem(ver_merk + form1.ListBox2.Items[z], TObject (form1)); end; end; end; Es werden jetzt wieder alle verzeichnisse und Daten gelistet di im root liegen. |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
[edit] Bau dir doch erstmal eine Funktion, die lokal auf der Festplatte rekursiv Verzeichnisse auflistet. Wie Manuel schon sagte: Such mal in der CodeLib von der DP, da sind Funktionen irgendwo, die das machen. Gehe sie durch (Breakpoints, F8) und verstehe sie. Dann setze das nach FTP um. [/edit] |
Re: liste alle FTP Daten. hatt noch kleine Fehler
ok Ich hab schon angefangen
Delphi-Quellcode:
Ich binn eigenlich der meinung das das richtig ist aber irgendwie will es noch nicht so wie ich will.
procedure list(dir: string);
var d, all: integer; dirja: boolean; begin form1.IdFTP1.ChangeDir(dir); form1.IdFTP1.List(form1.ListBox3.Items, '*', false); for all:=0 to form1.ListBox3.Count-1 do begin dirja:= true; for d:=0 to length(form1.ListBox3.Items[0]) do begin if form1.ListBox3.Items[0][d]= '.' then begin form1.ListBox2.AddItem(form1.ListBox3.Items[0], TObject (form1)); form1.ListBox3.Items.Delete(0); dirja:= false; end; end; if dirja then begin list(form1.ListBox3.Items[0]); form1.ListBox3.Items.Delete(0); end; end; end; auserdem brauche ich ja den kompletten pfad zur datei wie mache ich dass? |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Guten Abend,
mein Vorschlag zum Auflisten der Verzeichnisse eines FTP Servers. Getestet habe ich mit einem linux FTP-Server und es bestehen gute Chancen das der Code mit einem Windows FTP-Server nicht funktionieren wird.
Delphi-Quellcode:
procedure getFtpSubFolder(ftp:TidFtp;rootFolder:String;folderList:TStringList);
var sl: TStringList; i: Byte; begin sl := TStringList.create; // mask blanks rootFolder:=StringReplace(rootFolder,' ','\ ',[rfReplaceAll]); // get directorylist with details ftp.List(sl,rootFolder+'*',true); if sl.count > 0 then begin for i:=0 to sl.count -1 do begin if sl[i][1] = 'd' then // is it a folder begin // cut directory name sl[i]:=copy(sl[i],57,length(sl[i])); // add to folder list folderList.Add(rootFolder+sl[i]); // get subfolders from directory getFtpSubFolder(ftp,rootFolder+sl[i]+'/',folderList); end; end; end; sl.free; end; Angewendet wird es so:
Delphi-Quellcode:
[edit]
procedure TForm1.Button1Click(Sender: TObject);
var sl :TStringList; begin sl := TStringList.Create; idftp1.Host:='****'; idftp1.Username:='****'; idftp1.Password:='****'; idftp1.Connect(); getFtpSubFolder(idftp1,'/',sl); idftp1.Disconnect; memo1.Lines.Assign(sl); sl.free; end; .. und noch eine Variante die alle Dateien und Verzeichnisse auflistet.
Delphi-Quellcode:
procedure getFtpFileList(ftp:TidFtp;rootFolder:String;folderList:TStringList);
var sl: TStringList; i: Byte; FName: String; begin sl := TStringList.create; // mask blanks rootFolder:=StringReplace(rootFolder,' ','\ ',[rfReplaceAll]); // get directorylist with details ftp.List(sl,rootFolder+'*',true); if sl.count > 0 then begin for i:=0 to sl.count -1 do begin // cut directory name FName:=copy(sl[i],57,length(sl[i])); if sl[i][1] = 'd' then // is it a folder begin // add to folder list folderList.Add(rootFolder+FName+'/'); // get subfolders from directory getFtpFileList(ftp,rootFolder+FName+'/',folderList); end else begin // add Filename to list folderList.Add(rootFolder+FName); end; end; end; sl.free; end; Grüße Klaus |
Re: liste alle FTP Daten. hatt noch kleine Fehler
also funktioniren tut es nicht. meine frage warum??
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Hat jemand eben ne Glaskugel für mich?
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Freut mich, dass jemand noch eine hat. Ich schick Dir per PN grad meine Postadresse :zwinker:
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,
Glaskugel habe ich auch keine. Was es sein könnte das die Prozedur bei dem Aufruf unbekannt ist. In meinem simplen Beispielprojekt wurde die Prozedur vor der ButtonClick Methode eingefügt. Daher ist sie in der ButtonClick Methode bekannt weil vorher definiert. Du kannst die Prozedur auch gerne zur Methode Deiner Klasse machen. Dann würde der Prozedurkopf so ausschauen:
Delphi-Quellcode:
Und die Klassendefinition so:
procedure TForm1.getFtpFileList(ftp:TidFtp;rootFolder:String;folderList:TStringList);
Delphi-Quellcode:
Anbei noch das Beispielproject mit Screenshot, exe und pas.
TForm1 = class(TForm)
... procedure Button1Click(Sender: TObject); private procedure getFTPFileList(ftp:TidFtp;rootFolder:String;folderList:TStringList); { Private declarations } public { Public declarations } end; .. gerne geschehen. Grüße Klaus |
Re: liste alle FTP Daten. hatt noch kleine Fehler
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Hallo Maximilian,
und was willst Du uns nun damit sagen? Stören Dich die doppelten Slashes? Sind nicht alle Dateien gelistet worden? Wir wissen nicht wie Dein Server ausschaut, deshalb ist es schwierig aus Deinen Aussagen zu lesen was Dir nicht passt. Wie stellt sich denn Dein Server dar, wenn Du dich mit einem FTP gestartet aus der Konsole mit ihm verbindest und ein ls -l im root und im www Verzeichnis durchführst? Grüße Klaus |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Sorry, ich wollt damit eigentlich nur fragen ob dass mitt den"//" normal ist.
auserdem gibt es das verzeichniss "www" nur einmal. Und es sind auch nicht alle daten gelistet. z.b. die in den Unter Unterverzeichnissen nicht. Zitat:
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Nein, das mit den doppelten Slashes ist
meines Erachtens nicht normal. Das ist mir noch unergründlich warum die bei Dir auftauchen. In meiner Testumgebung treten sie nicht auf. Wenn Sie dich sehr stören kanst Du diese mit Pfad:=StringReplace(Pfad,'//','/'); entfernen. Mit root meinte ich das oberste Verzeichnis auf das Du auf dem Server zugriff hast. Mhm, auch das nicht alle Dateien gelistet werden kann ich so nicht bestätigen. Ist das Memofeld in der Breite eventuell zu kurz geraten, sodas eventuell Pfade und Name abgeschnitten werden? [edit] Habe gerade in Deinem ersten Screenshot gesehen, dass die Verzeichnisse im Listing bei Dir mit einem / abschließen. Ich füge, da das bei mir nicht der Fall ist, jeweils hinter einem Verzeichnisname ein / ein. Daher werden die Slashes bei Dir doppelt angezeigt. [/edit] Grüße Klaus |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
Auf dem Server liegen etwa 2000 Dateien von meinem CMS (Joomla!) die liste müsste viel Länger sein. außerdem gibt es das Verzeichnis 'www/www' nicht nur das Verzeichnis 'www/' Wass ich mich langsam Frage ist:
|
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
Start->Run cmd eingeben ein Konsolenfenster poppt auf. Hier eingeben: ftp <Adresse des Servers> username: <Dein Username> password: <Dein Passwort> ls -l cd www ls -l Der FTP Client von Indy hat das nicht, weil Indy nur die FTP Funktionalität kapselt. Und eine "alles auflisten" gibt es bei FTP nicht. Siehe auch die ![]() .. und das noch niemand dieses Problem gehabt hat, wage ich doch sehr zu bezweifeln. .. und wenn dem wirklich so wäre, dann muß man das Problem eben selber lösen, es wäre doch alles recht langweilig wenn man ein Programm nur durch copy+paste zusammenstricken könnte. Der Lerneffekt bleibt dann auch auf der Strecke. Grüße Klaus |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Zitat:
Hier haben dir mind. 2-3 Leute (inkl. mir) gesagt, dass du dir doch erstmal Funktionen aus der DP CodeLib anschauen, die lokale Verzeichnisse per FindFirst / FindNext und Rekursion durchsuchen und diese verstehen sollst! Und erst dann das Ganze nach FTP umsetzen. Aber wie die meisten inspirierten Anfänger willst du am liebsten direkt beim Ziel ankommen, ohne den Weg nehmen zu wollen. Und es passiert auch immer wieder das gleiche: Man verrennt sich in Sackgassen.
Du kannst auch nicht erwarten, dass dir hier jemand komplette Lösungen gibt. Und warum Klaus sowas immer macht, versteh ich auch nicht, obwohl er doch immer wieder merken müsste, was für "Nacharbeiten" man mit solchen gut gemeinten Gesten hat. :P |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Ich habe ja ein bei DELPHI-Treff einen Code gefunden der alle Dateien auf der Festplatte recusiv Listet.
Aber ich verstehe ihn nicht wirklich und solange ich ihn nicht verstehe kan ich ihn nicht in FTP umsetzen.
Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: String; const Mask: String;
List: TStrings; WithSubDirs, ClearList: Boolean); procedure ScanDir(const Directory: String); var SR: TSearchRec; //was ist das vür ein Typ. Wass kann er. kann man ihn auch in FTP nutzen? begin if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) {Woher kommt das jatzt plötzlich. hir wird wohl igentwetwas in diesen SearchRec geschriben} = 0 then try repeat List.Add(Directory + SR.Name) // Ok hier wird etwas was in der variable steh in die Liste geschrieben. until FindNext(SR) {Woher kommt das jetzt?} <> 0; finally FindClose(SR) {Und das? Dass sind dan wohl alles Befehle die Delphi schon bereitstellt ok.}; end; if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile {???}, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and {Noch mehr ???} (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end; |
Re: liste alle FTP Daten. hatt noch kleine Fehler
Du kannst den Cursor in TSearchRec setzen und F1 drücken, genauso bei faAnyFile, etc. Da wird dann ne Hilfe aufgehen, die dir das alles erklärt.
Weitere Links: - ![]() - ![]() - ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
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