Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdFTP: Alles auflisten (https://www.delphipraxis.net/132093-idftp-alles-auflisten.html)

Z4ppy 6. Apr 2009 00:27


IdFTP: Alles auflisten
 
Ich suche nach einer Methode, alles auf einem FTP aufzulisten (in einer TStringList)... Dabei möchte ich sowohl nur Dateien, als auch nur Ordner (bzw. die untersten Unterordner) auflisten können. Ich nenn meine Funktion jetz einfach mal auflisten(var a:TStringList; folder:boolean); - wenn folder true ist, werden die untersten Unterordner aufgelistet, wenn folder false ist, die Dateien...

Beispiel:
foldera
--folderaa
----aaa.dat
----aab.dat
--aa.dat
folderb
--folderba
----folderbaa
------folderbaaa
----baa.dat

auflisten(a,false):
Code:
foldera/folderaa/aaa.dat
foldera/folderaa/aab.dat
foldera/aa.dat
folderb/folderba/baa.dat
auflisten(a,true):
Code:
foldera/folderaa
folderb/folderba/folderbaa/folderbaaa
Ich hab irgendwie überhaupt keine Ahnung, wie ich das am besten angehen soll :?

MfG Z4ppy

PS: In welcher Reihenfolge das Resultat zurückgegeben wird, ist mir ziemlich wurst. Hauptsache, es kommen exakt diese Strings zurück (und keine anderen) ^^

mjustin 6. Apr 2009 05:45

Re: IdFTP: Alles auflisten
 
Zitat:

Zitat von Z4ppy
Ich suche nach einer Methode, alles auf einem FTP aufzulisten (in einer TStringList)...

BTVisualFTP enthält Funktionen zum rekursiven Einlesen von Verzeichnissen:

http://sourceforge.net/projects/btvisualftp/

http://btvisualftp.sourceforge.net/

http://cc.embarcadero.com/Item/24525

Cheers,

Z4ppy 6. Apr 2009 20:38

Re: IdFTP: Alles auflisten
 
Kannst du mir sagen, in welcher Unit die Funktion ist und wie sie heisst?

MfG Z4ppy

mjustin 6. Apr 2009 20:48

Re: IdFTP: Alles auflisten
 
Zitat:

Zitat von Z4ppy
Kannst du mir sagen, in welcher Unit die Funktion ist und wie sie heisst?

MfG Z4ppy

Schau mal in FtpBatchProcessing.pas, procedure TFtpFileCollector.Collect enthält eventuell manches brauchbares.

Cheers,

Z4ppy 8. Apr 2009 14:25

Re: IdFTP: Alles auflisten
 
Hardgecodet konnte ich es nun lösen - hardgecodet heisst in diesem Fall, dass es nur mit einem Server funktioniert :roll: Auf die genaueren Umstände geh ich jetzt mal nicht ein...

Wie kann ich denn nur die Ordner auflisten?
Mein Ansatz war erstmal: Ich liste auf (mit Details), gucke ob das erste Zeichen ein d ist und extrahiere dann den Namen. Die ersten Schritte gehen auch ohne weiteres, nur kriege ich es einfach nicht gebacken, den Namen zu extrahieren... Wie muss man das lösen? Extrahiert man von hinten her bis zum ersten Leerzeichen, dann hat man Probleme, wenn der Name Leerzeichen enthält. Extrahiert man von vorne, dann hat man Probleme, weil jeder Server die Daten so zurückliefert, wies ihm passt.

MfG Z4ppy

Z4ppy 21. Apr 2009 16:03

Re: IdFTP: Alles auflisten
 
Let's push it :stupid:

MfG Z4ppy

Klaus01 22. Apr 2009 20:28

Re: IdFTP: Alles auflisten
 
Guten Abend,

diesen Thread kennst Du schon?

Grüße
Klaus

Z4ppy 22. Apr 2009 20:33

Re: IdFTP: Alles auflisten
 
Nein, kannte ich nicht, ist aber das gleiche Problem ^^
Das Problem is nämlich, dass du das hardcoded löst - der Ordnername fängt nämlich nicht immer beim Zeichen Nr. 57 an ;) Ich hab hier 2 UNIX-Server, aufm einen isses Nr. 57, aufm andern Nr. 56 ;)
Man muss also irgendwie dynamisch erkennen, wo der Ordnername beginnt - und das ist genau mein Problem ;)

MfG Z4ppy

Klaus01 27. Apr 2009 21:20

Re: IdFTP: Alles auflisten
 
Guten Abend,

ein Vorschlag nach der Holzhammermethode:

Führe ein FTP.list ohne Details durch
speichere die File/Foldernamen in einer StringList.
Führe ein FTP.list mit Details durch.

Durchlaufe die erste Liste und schau
nach ob diese Einträge in der zweiten Liste
ein Eintrag d für Directory an der ersten Stelle
des Eintrags haben.

Grüße
Klaus

Z4ppy 28. Apr 2009 12:52

Re: IdFTP: Alles auflisten
 
Das hab ich schon probiert aber es geht leider nicht. Denn beide Listen werden automatisch nach Name geordnet. Bei der Details-Liste wird das dann aber bestimmt nicht nach dem Namen des Ordners/der Datei geordnet, weil spätestens das Änderungsdatum überall anders ist und dann nach dem geordnet wird...

MfG Z4ppy

Klaus01 28. Apr 2009 13:39

Re: IdFTP: Alles auflisten
 
Hallo,

es ist doch eingentlich egal, wie die Listen sortiert sind.

For i:= 0 to SL_ohneDetails.count -1 do
begin
for j:= 0 to SL_mit Details.count -1 do
begin
if pos(...) then

end;
end;

Z4ppy 28. Apr 2009 14:18

Re: IdFTP: Alles auflisten
 
Wird wohl auch nicht gehen, denn was passiert, wenn eine Datei namens "abc" (ohne Endung) sowie ein Ordner namens "aabc" existiert?

MfG Z4ppy

€dit: Nun gut, das kann man mit Pos(' '+ListeOhneDetails[i],ListeMitDetails[j]) abfangen, allerdings bleibt dann das problem, wenn eine Datei namens "abc" sowie ein Ordner namens "xyz abc" da is ;)

Z4ppy 30. Apr 2009 18:44

Re: IdFTP: Alles auflisten
 
Ich lös es jetz auf ne etwas modifizierte Holzhammermethode :D
Zwar noch nich umgesetzt, aber müsste gehen ;)

Ich liste zweimal, einmal mit Details, einmal ohne.
Dann drehe ich sämtliche Strings in den beiden StringLists um und sortiere.
Anschliessend gucke, ob das letzte Zeichen (in der Liste mit Details) ein d ist, wenn ja, nehme ich den entsprechenden Eintrag aus der Liste ohne Details und drehe ihn wieder um :D

Ineffizient, wird aber funktionieren :lol:

Wenn jemand einen besseren Vorschlag hat, bitte her damit ;)

MfG Z4ppy

jfheins 30. Apr 2009 18:52

Re: IdFTP: Alles auflisten
 
Lass IdFTP die Arbeit machen ;)

Hier mal ein Ausschnitt aus meiner FTPBrowser-Unit:
Delphi-Quellcode:
procedure TFtpBrowser.CreateDirectoryListing;
var
  i: Integer;
begin
  Working := True;

  if FFtp.Connected then
  begin
    FFtp.SendCmd('TYPE A');

    FFtp.List (nil, '-a', True);

    for i := 0 to Pred (FFtp.ListResult.Count) do
      CreateItemFromFileInfo (GetFileInfo(i));
  end;
  Working := False;
end;

procedure TFtpBrowser.CreateItemFromFileInfo(const FileInfo: TFileInfo);
var
  ListItem: TListItem;
begin
  if FileInfo.Filename <> '.' then
  begin
    ListItem := FFiles.Items.Add;

    if FileInfo.FileType = 'Ordner' then
      if Fileinfo.Filename <> '..' then
        ListItem.ImageIndex := 0
      else
        ListItem.ImageIndex := 1
    else
      ListItem.ImageIndex := 2;

    ListItem.Caption := FileInfo.Filename;

    if FileInfo.Size > 1000000 then
      ListItem.SubItems.Add(IntToStr (FileInfo.Size DIV 1000000) + ' MB')
    else if FileInfo.Size > 1000 then
      ListItem.SubItems.Add(IntToStr (FileInfo.Size DIV 1000) + ' KB')
    else if FileInfo.Size > 0 then
      ListItem.SubItems.Add(IntToStr (FileInfo.Size) + ' Byte')
    else
      ListItem.SubItems.Add('n/a');

    ListItem.SubItems.Add(FileInfo.FileType);
    ListItem.SubItems.Add(FileInfo.Date);
  end;
end;

Klaus01 2. Jul 2009 19:45

Re: IdFTP: Alles auflisten
 
Zitat:

Zitat von Z4ppy

Wenn jemand einen besseren Vorschlag hat, bitte her damit ;)

MfG Z4ppy

Hallo Z4appy,

vielleicht hilft Dir ja noch dieser Tip.

Grüße
Klaus

Z4ppy 2. Jul 2009 20:33

Re: IdFTP: Alles auflisten
 
Danke, werde ich mir angucken, wenn ich Ende Juli aus den Ferien zurückkomme (fahre morgen) ;)

MfG Z4ppy

PS.: Mein Name bitte ohne a... Aber keine Sorge, das passiert so vielen :lol:

schöni 2. Sep 2010 18:31

AW: Re: IdFTP: Alles auflisten
 
Zitat:

Zitat von jfheins (Beitrag 908374)
Lass IdFTP die Arbeit machen ;)

Hier mal ein Ausschnitt aus meiner FTPBrowser-Unit:
Delphi-Quellcode:
procedure TFtpBrowser.CreateDirectoryListing;
var
  i: Integer;
begin
  Working := True;

  if FFtp.Connected then
  begin
    FFtp.SendCmd('TYPE A');

    FFtp.List (nil, '-a', True);

    for i := 0 to Pred (FFtp.ListResult.Count) do
      CreateItemFromFileInfo (GetFileInfo(i));
  end;
  Working := False;
end;

procedure TFtpBrowser.CreateItemFromFileInfo(const FileInfo: TFileInfo);
var
  ListItem: TListItem;
begin
  if FileInfo.Filename <> '.' then
  begin
    ListItem := FFiles.Items.Add;

    if FileInfo.FileType = 'Ordner' then
      if Fileinfo.Filename <> '..' then
        ListItem.ImageIndex := 0
      else
        ListItem.ImageIndex := 1
    else
      ListItem.ImageIndex := 2;

    ListItem.Caption := FileInfo.Filename;

    if FileInfo.Size > 1000000 then
      ListItem.SubItems.Add(IntToStr (FileInfo.Size DIV 1000000) + ' MB')
    else if FileInfo.Size > 1000 then
      ListItem.SubItems.Add(IntToStr (FileInfo.Size DIV 1000) + ' KB')
    else if FileInfo.Size > 0 then
      ListItem.SubItems.Add(IntToStr (FileInfo.Size) + ' Byte')
    else
      ListItem.SubItems.Add('n/a');

    ListItem.SubItems.Add(FileInfo.FileType);
    ListItem.SubItems.Add(FileInfo.Date);
  end;
end;

Da hab ich mal paar Fragen:

-Wo ist TListItem definiert?
-Wo ist der Filetyp definiert zB. "Ordner"?

Nun will ich das Home Verzeichnis des Servers erkennen. Ich gehe dabei davon aus das, wenn ich mich im Internet an einem FTP Server anmelde, meine Zugangsdaten mit meinem Home-Verzeichnis verknüpft sind, ich also nur auf dieses Verzeichnis Zugriff habe, in welchem dann alle Dateien und Ordner zu finden sind, zu denen ich die Zugriffsberechtigung besitze.

Nun will ich mich vom Indy Client aus mit diesem FTP-Server verbinden. Dazu muss ich ja erst mal wissen, welches mein Home Verzeichnis ist. Wie ist das normalerweise im Internet gelöst? Erhalte ich da mit dem Zugang den Namen meines Home Verzeichnisses oder ist dessen Name völlig egal. Wenn völlig egal, dann muss allerdings mein FTP Client wissen, wie er dieses Home Verzeichnis finden kann. Kann mir hier jemand sagen, mit welcher Methode ich das Home Verzeichnis erhalte?

Sorry, ich kann mein Anliegen nicht deutlicher beschreiben. Wo finde ich hierzu und zu FTP und Indy eine für den Anfänger assagekräftige Dokumentation?

Ich habe nur die Indys, wie sie mit Turbo Delphi mitgeliefert wurden. Leider sind da keine aussagekräftigen Demos dabei.

Ich will mein FTP Homeverzeichnis als Root setzen und dann mir alle Dateien auf dem FTP Sever anzeigen lassen. Später will ich Dateien auf den Server hochladen und vom Server runterladen können, weshalb ich die Verzeichnisstruktur sehen möchte. Am liebsten mit ShellTreeView und ShellListView. Aber ich muss ja dem ShellTreeView erst mal das Home Verzeichnis meines FTP Servers übergeben. Wie mache ich das? Wo gibt es da Beispiele?

jfheins 2. Sep 2010 18:47

AW: IdFTP: Alles auflisten
 
Hi,
guck' mal hier: http://www.delphipraxis.net/153961-i...satzinfos.html Post #9

Das reduziert sich dann (wenn man meinen Code abzieht) auf:
Delphi-Quellcode:
procedure xyz.CreateDirectoryListing;
var
  i: Integer;
begin
    FFtp.SendCmd('TYPE A');

    FFtp.List (nil, '-a', True);

    for i := 0 to Pred (FFtp.ListResult.Count) do
      CreateItemFromFileInfo (FTP.DirectoryListing[i]);
end;

procedure xyz.CreateItemFromFileInfo(const FileInfo: TIdFTPListItem);
var
  ListItem: TListItem;
begin
  // Mach was mit FileInfo, z.B. mittels Listitem in eine Listview tun
end;
TListItem ist nur relevant, wenn du das Gedöns in eine Listview schmeißen möchtest.
Die Shell* Komponenten und FTP kannste knicken. Die operieren nur auf dem lokalen Dateisystem ;)

Das Rootverzeichnis des FTP Servers ist normalerweise "/" - und da solltest du auch nach der Anmeldung direkt drinnen sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.

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