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