.NET
VB: Ordnerstrukturen einlesen Teil 1
Posted on .In diesem ersten Teil (von zwei) geht es darum wie man einen Ordner (inklusive aller Unterordner) in ein Treeview laden kann. In dem ersten Teil werden wir eine kleine Demoapp erstellen, die Den Ordnerbaum rekursiv einließt.
Jeder kennt den Windows Explorer mit der Ordneransicht auf der linken Seite, die durch Linien mit einander verbunden sind. Wenn man selbst Programme schreibt kommt man oft an die Stelle, wo man ebenfalls ein solchen Ordnerbaum erstellen muss oder einen anderen einlesen und verarbeiten.
Da VB dafür noch keine Funktion bereitstellt muss man das noch selber machen, in diesem Beispiel werde ich euch zeigen wie man das mit wenig Aufwand erledigen kann.
Wie es schon im ersten Absatz steht werde ich dafür eine rekursive Methode benutzen. Eine rekursive Methode ist eine Methode die sich selbst aufruft. Solche Methoden werden sehr oft in Verbindung mit Ordnern und Listen eingesetzt.
Hier zunächst meine Funktion:
Function getFoldersFromPath(ByVal start As String, _ Optional ByVal tv As TreeNode = Nothing) 'Start = Der Ordner den wir in die TreeView laden sollen 'tv = Die aktuelle TreeNode an der wir arbeiten 'Jeden ordner in dem übergebenen Pfad (start) bearbeiten For Each s As IO.DirectoryInfo In _ New IO.DirectoryInfo(start).GetDirectories 'Einen neuen Node erstellen 'n ist jeweils immer der Kern Node Dim n As New TreeNode(s.Name) 'Nun sich selbst aufrufen und als aktuellen Node 'sich selbst (n) übergeben getFoldersFromPath(s.FullName, n) 'Nach dem der Node n inkl. aller Unterverzeichnisse 'eingelesen wurde diesen unserem hauptnove tv übergeben tv.Nodes.Add(n) Next 'Nun den Note mit allen eingelesenen Ordnern zurückgeben Return tv End FunctionAuch wenn diese Funktion nur aus 7 Zeilen besteht hat sies dennoch insich. Denn es ist gar nicht so einfach sich da reinzudenken!
Gehen wir diese Funktion mal durch. Die Funktion erwartet zwei Parameter zu Beginn. Einen String, der den Pfad angibt, aus dem die Ordner ausgelesen werden soll und eine TreeNode zu der die ausgelesenen Ordner hinzugefügt werden sollen.
Der zweite Parameter ist mit dem Schlüsselwort Optional markiert, was bedeutet, dass dieser Parameter beim Aufrufen der Funktion nicht übergeben werden muss!
In Zeile 6 – 17 lesen wir den übergebenen Ordner (aus der Variable start) aus und nehmen seinen Inhalt durch.
Das „Geheimnis“ dieser Funktion liegt in Zeile 13 dort wird der Rekursive Aufruf gestartet und als Parameter der aktuell zu bearbeitende Ordner (s) und der aktuelle Baum (n). Nach diesem Aufruf wird dieselbe Funktion nochmals gestartet und läuft den Ordner n durch und startet sich dabei ggf. nochmal selbst falls n auch Unterordner enthält!
So könnte es aussehen, nach dem ein Ordner eingelesen wurde:
Wie man sieht wurde der ganze ordner eingelesen und als Baum in der TreeView dargestellt. Nach Belieben kann man nun noch Verschönerungen vornehmen, wie zb Ordner-Icons hinzufügen aber das ist ein anderes Thema!
Leider hat diese Methode einen entscheidenden Nachteil, nämlich die Performance! Solange die Ordner nicht allzugroß sind funktioniert diese Methode super! (ca solange es < 1000 Ordner sind)
Aber versucht man mal den ordner „C:\“ einzulesen, also den gesamten Ordnerverlauf der Partition C: so könnte es schon mal ein oder zwei Minuten dauern! Abhängig von dem Umfang der Ordnerstruktur auf eurer C-Partition!
Wie macht man das nun also, dass die Ordner schnell eingelesen werden, zb so wie im Windows Explorer, der nur wenige Augenblicke dafür benötigt! – So scheint es zumindest!
Mit dieser Thematik werden wir uns in dem zweiten Teil dieses Beitrags beschäftigen!
Dieses Beispiel herunterladen: Download
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author jo
Posted at 19:16 27. August 2009.
post einfach den code alter