Entwickler-Ecke
Internet / Netzwerk - FTP Verzeichnisstruktur auslesen
Handycommander - Fr 24.02.06 00:25
Titel: FTP Verzeichnisstruktur auslesen
hi,
ich habe eine listview und möchte damit die ordnerstruktur meines ftp server anzeigen! die verbindung über indy ftp klappt! wie kann ich jetzt in die listview die ordnerstruktur anzeigen?
danke
Grolle - Fr 24.02.06 00:46
Hi!
Bei mir klappt dies hier (Indy10):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.listverzeichnisse; var list : TStringList; i : integer; begin Listbox2.Clear; list := TStringList.Create; IdFTP.List(list, '', false); for i := (list.Count - 1) downto 0 do if (list.Strings[i] = '') or (list.Strings[i] = '.') or (list.Strings[i] = '..') or (Pos('.', list.Strings[i]) <> 0) then begin list.Delete(i); Listbox2.Items := list; end; list.free; end; |
Viele Grüße....
Handycommander - Fr 24.02.06 12:46
dabei hängt sich das programm auf...
Martin1966 - Fr 24.02.06 13:22
Hast du schon mal versucht, das Programm zu debuggen?
Heiko - Fr 24.02.06 21:28
Handycommander hat folgendes geschrieben: |
dabei hängt sich das programm auf... |
Martin1966 hat folgendes geschrieben: |
Hast du schon mal versucht, das Programm zu debuggen? |
Das Problem mit dem Aufhängen des Programmes hat sich geklärt, nach dem er über MSN mit dem Problem an mich herantrat. Es lag daran, dass er vergessen hat Passiv auf true zu setzten (Verbinung über Proxy (also auch Router) läuft dann nicht richtig).
Grolle hat folgendes geschrieben: |
Hi!
Bei mir klappt dies hier (Indy10):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.listverzeichnisse; var list : TStringList; i : integer; begin Listbox2.Clear; list := TStringList.Create; IdFTP.List(list, '', false); for i := (list.Count - 1) downto 0 do if (list.Strings[i] = '') or (list.Strings[i] = '.') or (list.Strings[i] = '..') or (Pos('.', list.Strings[i]) <> 0) then begin list.Delete(i); Listbox2.Items := list; end; list.free; end; |
Viele Grüße.... |
Ich glaube nicht dass der Quelltext wirklich das macht was er soll, denn bei Dateien ergibt Pos('.', DateiName) immer größer 0 (da immer einer vorhanden ist bei Dateinamen unter Win.). Des weiteren sollte man aus Performancegründen die Zeile
Listbox2.Items := list; erst nach der Schleife ausführen (du überschreibstt ja immer die alte Liste ... ).
Handycommander - Sa 25.02.06 17:47
wie kann ich des dann in einer listview anzeigen lassen?
mit der ordneranzeige in einer combobox bzw in einer treeview?
in ner listbox funktionierts aber nur mit den ordnern!
wie funtkioniert das?
danke
Heiko - Sa 25.02.06 19:39
In eine ListView es zu stellen ist besser, denn so kannst du direkt eine ShellTreeView machen. Dafür stellst du beim TreeView den ViewStyle auf vsReport. Als nächstes klickst du doppelt auf die Komponente :arrow: es öffnet sich ein kleines Fenster wo du Columns hinzufügen kannst:
0 - Name
1 - Größe
2 - Typ
3 - Geändert am
Hinweis: Die x - fügt Delphi automatisch hinzu.
Wenn du das hast klickst du in dem kleinem Dialog auf Größe und stellst du im Objectinspektor Alignment auf taRightJustify. Dann kannst du das kleine Fenster schließen, da du es nicht mehr brauchst. Damit hast du schon einmal das Aussehen einer ShellTreeView.
Zum Befüllen des ListViw gebe ich dir mal den fertigen Quelltext, allerdings musst du das Befüllen des Arrays TDateiInfo selber machen (also aus dem FTP auslesen):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| procedure InitialisiereIcons; var SysIL: uint; SFI: TSHFileInfo; SmallImages: TImageList; begin SmallImages := TImageList.Create(Form1); SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); if SysIL <> 0 then begin SmallImages.Handle := SysIL; SmallImages.ShareImages := TRUE; end; Form1.DateienListView.SmallImages := SmallImages; end;
function GetFileSize(Groesse: Integer): String; begin if Groesse>1023 then begin if Groesse>1048575 then begin if Groesse>1073741823 then begin Result:=Format('%.2f GB', [Groesse/1073741824]) end else begin Result:=Format('%.2f MB', [Groesse/1048576]) end end else begin Result:=Format('%.2f KB', [Groesse/1024]) end end else begin Result:=IntToStr(Groesse)+' Bytes' end end;
procedure ShowFiles; var i: integer; ListItem: TListItem; Info: TSHFileInfo; begin Form1.DateienListView.Items.Clear; Form1.DateienListView.Items.BeginUpdate; for i:=0 to High(DateiInfo) do begin ListItem:=Form1.DateienListView.Items.Add; SHGetFileInfo(PChar(DateiInfo[i].Dateiname), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES or SHGFI_TYPENAME); ListItem.ImageIndex:=Info.IIcon;
ListItem.Caption:=DateiInfo[i].Dateiname; ListItem.SubItems.Add(GetFileSize(DateiInfo[i].Bytes)); ListItem.SubItems.Add(Info.szTypeName); ListItem.SubItems.Add(DateiInfo[i].Datum); end; Form1.DateienListView.Items.EndUpdate; Form1.DateienListView.Repaint; end; |
Dafür musst du im globalen Bereich den Typ TDateiInfo erst einmla noch festlegen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type TDateiInfo=record Dateiname: String; Bytes: Integer; Datum: String; end; |
Und natürlich die Variable noch definieren mit
Delphi-Quelltext
1: 2: 3:
| var Form1: TForm1; DateiInfo: array of TDateiInfo; |
Was in das Array TDateiInfo gespeichert werden soll erkennt man sicherlich von alleine ;). Das Array bei der Auflistung der Dateien vom FTP (wie du das ausliest musst du selber machen, da mein Programm wo ich das hier gemacht habe nicht auf FTP sondern PHP beruht ;) ).
Jetzt ist es eigentlich schon Startklar, allerdings werden die Bilder zu den Dateien noch nicht richtig angezeigt. Falls du dir den Quelltext genau anschaust weißt du auch warum.
Genau, wir haben die Prozedur InitialisiereIcons noch nicht aufgerufen. Das machen wir im OnShow wenn auch die ListView zu 100% erzeugt wurde und somit keine Fehlermeldungen evtl. auftreten (alternativ kannst du es auch im OnActivate aufrufen):
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormShow(Sender: TObject); begin InitialisiereIcons; end; |
So das wäre es erst einmal meinerseits. Wenn zum Quelltext fragen bestehen beantworte ich sie gerne, allerdings kann ich dir beim FTP nicht weiterhelfen, da ich damit nicht mehr arbeite (war mir zu Unsicher, da man das PW abfangen konnte). Aber zum dem Problem das nur Ordner angezeigt werden habe ich noch einen kleine Frage. Hast du die Zeile in der if-Abfrage mit dem
(Pos('.', list.Strings[i]) <> 0) entfernt? Denn diese filtert alle Dateien aus, die einen Punkt beinhalten und somit alle Dateien.
mfg
Heiko
Delete - Sa 25.02.06 19:59
@heiko: Und der ShellTreeview kann auch Verzeichnisse auf einem FTP-Server auflisten?
Heiko - Sa 25.02.06 20:13
Luckie hat folgendes geschrieben: |
@heiko: Und der ShellTreeview kann auch Verzeichnisse auf einem FTP-Server auflisten? |
Meines Wissens kann ein ShellTreeView es nicht, des wegen habe ich hier ja einen TreeView genommen, den man dann manuell befüllen muss. Zum Auffüllen muss man nur die Daten auslesen und in das Array geben und nach dem Befüllen noch ShowFiles aufrufen zum Anzeigen. Das Array braucht man eigentlich gar nicht, sprich man kann es auch ohne machen. Da das jedoch Source aus meinem Programm ist wollte ich den jetzt nicht umschreiben (da brauche ich das Array noch für viele Dinge ;) ).
Handycommander - So 26.02.06 19:05
wie muss ich des mit dem array machen? :oops:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!