AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Rekursiver Aufruf von FTPFindFirstFile
Thema durchsuchen
Ansicht
Themen-Optionen

Rekursiver Aufruf von FTPFindFirstFile

Ein Thema von hsbc · begonnen am 5. Jun 2008 · letzter Beitrag vom 18. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#1

Rekursiver Aufruf von FTPFindFirstFile

  Alt 5. Jun 2008, 15:16
Hallo allerseits,

ich möchte mittels FTPFindFirstFile ein Server-Verzeichnis mit allen Unterverzeichnissen einlesen und in einer TreeView speichern.

Die erste Ebene funktioniert auch einwandfrei, nur ein rekursiver Aufruf von FTPFindFirstFile schlägt insofern fehl, dass die Routine nil zurückliefert, also keine weiteren Daten.

Jetzt meine Fragen:

1. Weiss jemand, wie man FTPFindFirstFile rekursiv aufrufen kann?
2. Sollte dies nicht möglich sein, kennt jemand eine Möglichkeit, mittels Indy (List) in eine TreeView zu speichern?

mfg
Herbert
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Rekursiver Aufruf von FTPFindFirstFile

  Alt 5. Jun 2008, 16:55
Hast du vielleicht "\" anstelle von "/" als Trennzeichen verwendet?
Zeig mal Sourcecode!
Andreas
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#3

Re: Rekursiver Aufruf von FTPFindFirstFile

  Alt 5. Jun 2008, 19:43
Hier der entsprechende Quellcode:

Delphi-Quellcode:
procedure TForm1.FindFilesTree(aTree: tTreeView; aPath: string; aNode: tTreeNode; aWithFiles: boolean);
var
  NodeTmp: tTreeNode;
  Info: pNodeInfo;
  hSearch: HINTERNET;
  findData: WIN32_FIND_DATA;
begin
  aTree.Items.BeginUpdate;

  if aPath = 'then aPath := '/';
  if aPath[Length(aPath)] <> '/then aPath := aPath + '/';

  if FTPSetCurrentDirectory(hConnect, PChar(aPath)) then begin
    hSearch := FTPFindFirstFile(hConnect, nil, findData, INTERNET_FLAG_DONT_CACHE, 0);
    if hSearch = nil then
    begin
      ; // Fehler
    end
    else begin
      repeat
        if findData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
        begin // Eintrag = Verzeichnis
          if (findData.cFileName[1] <> '.') then
          begin
            New(Info);
            Info^.Path := true;
            Info^.Name := aPath + findData.cFileName;
            // zum aktuellen Eintrag hinzufügen
            aNode := aTree.Items.AddChildObject(aNode, findData.cFileName, Info);
          end;

          // Knoten merken
          NodeTmp := aNode.Parent;
          // rekursiver Aufruf
          FindFilesTree(aTree, aPath+findData.cFileName, aNode, aWithFiles);
          // Gemerkten Knoten lesen
          aNode := NodeTmp;
        end
        else begin // Eintrag = Datei
          if aWithFiles then
          begin
            ;
          end;
        end;
      until not InternetFindNextFile(hSearch, @findData);
      InternetCloseHandle(hSearch);
    end;
  end;

  aTree.Items.EndUpdate;
end;
Wie gesagt, die erste Verzeichnisebene wird richtig in den Tree geschrieben. Der rekursive Aufruf gibt bei hSearch nil zurück.

mfg
Herbert
  Mit Zitat antworten Zitat
Benutzerbild von p0w3r5tr34m3r
p0w3r5tr34m3r

Registriert seit: 18. Aug 2003
Ort: Monheim am Rhein
153 Beiträge
 
RAD-Studio 2009 Pro
 
#4

Re: Rekursiver Aufruf von FTPFindFirstFile

  Alt 5. Jun 2008, 22:40
muss es unbedingt mit FTPFindFirstFile sein?

Hab hier was mit den standard Indy (v. 10) Kompos gemacht...

Delphi-Quellcode:
procedure TWorkerThread.ListDir(dir: String; const tv: TTreeView; var tn: TTreeNode);
var
  itm: TIdFTPListItems;
  i: Integer;
  node: TTreeNode;
  tmp: string;
begin
  thread.ftp.ChangeDir(dir);
  thread.ftp.List;
  itm := thread.ftp.DirectoryListing;
  for i := 0 to itm.count-1 do begin
    if itm.Items[i].ItemType = ditDirectory then begin
      node := form1.treeview1.Items.AddChild(tn, itm.Items[i].Filename);
      listdir(itm.items[i].filename, form1.treeview1, node);
      ftp.ChangeDirUp;
      ftp.list;
      itm := thread.ftp.DirectoryListing;
    end
    else
      form1.treeview1.Items.addChild(tn, itm.Items[i].filename+' ['+inttostr(itm.items[i].size)+']');
  end;
end;
musste deinen vorstellungen evtl. noch anpassen aber funktioniert auch rekursiv


MfG
Florian Cülter
ich bin ein notorischer alles-klein-schreiber!

der 100. Beitrag nach 3 Jahren 25 Wochen und einem Tag
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#5

Re: Rekursiver Aufruf von FTPFindFirstFile

  Alt 6. Jun 2008, 07:55
Hallo p0w3r5tr34m3r,

vielen herzlichen Dank.

Nachdem diese Routine vom Prinzip her gleich auf Anhieb funktionierte, habe ich mich doch entschlossen, das ganze mit Indy(10) zu verwirklichen. Hier dürfte Indy doch die Nase vorne haben.

mfg
Herbert
  Mit Zitat antworten Zitat
momo54321

Registriert seit: 18. Mär 2012
16 Beiträge
 
#6

AW: Rekursiver Aufruf von FTPFindFirstFile

  Alt 18. Mär 2012, 10:22
hi,
bin noch neu im thema delphi.
wie ruf ich denn die procedure auf?

so gehts leider nicht:
ListDir('/public_html/install2/',Treeview1,'/');
Code:
[DCC Error] Unit1.pas(1806): E2010 Incompatible types: 'TTreeView' and 'TTreeNode'

Geändert von momo54321 (18. Mär 2012 um 13:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Rekursiver Aufruf von FTPFindFirstFile

  Alt 18. Mär 2012, 10:47
Wie sieht denn Deine Prozedur aus, die aus #4 kann es ja nicht sein ... dann wäre der 3. Parameter falsch, nicht der 2.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#8

AW: Rekursiver Aufruf von FTPFindFirstFile

  Alt 18. Mär 2012, 13:00
hi, doch, der aus #4.

ich habe noch nie mit nodes und treeview gearbeitet, deswegen weiss ich nich in wie fern da was hin muss.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Rekursiver Aufruf von FTPFindFirstFile

  Alt 18. Mär 2012, 13:10
Ich hab's jetzt auch nicht im Kopf, aber die OH oder ein Tutorial zum TTreeView wird bestimmt helfen. (alternatif auch die Forensuche)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: Rekursiver Aufruf von FTPFindFirstFile

  Alt 18. Mär 2012, 13:14
die Meldung wenn o.g. Prozedur verwenden würdest wäre
Code:
[DCC Fehler] xxxx.pas(30): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Deine Prozedur scheint als 2. Parameter eine Treenode zu erwarten ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 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