Ordnerstruktur auslesen und für weitere Verwendung aufbereiten

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Madde.

    Ordnerstruktur auslesen und für weitere Verwendung aufbereiten

    Hallo Zusammen,

    ich habe vor einiger Zeit, mit großer Unterstützung hier im Forum, ein ähnliches Modell in einer Word/Excel Kombination erstellt. Ordnerstruktur wird eingelesen und in der Tabelle abgelegt. Läuft wunderbar und ist über die Jahre immer mehr gewachsen und an Funktionen erweitert worden.
    Eine Sache, welche immer ein Problem war, es ist nicht plattformunabhängig, da MSOffice vorhanden sein muss.
    Hier würde ich gern ansetzen und das Ganze in VB.Net umsetzen. Da ich noch immer kein Programmierer bin, sondern nur mit Codeschnipseln arbeite, welche ich mir für meine Zwecke zurechtbaue, bin ich erneut auf eure Hilfe angewiesen.
    Ich würde einfach mal erläutern, was ich benötige und wie es genutzt werden soll.
    Nach dem Einlesen soll es möglich sein, die Struktur komplett darzustellen vom ersten Ordner bis zum letzten Ordner. Anbei zur besseren Verständlichkeit das Bild.
    Wozu das Ganze? Hintergrund ist, die Struktur dient dann dazu, Trennblätter zu erstellen. Zum Einen soll die Struktur im Ganzen druckbar sein aber auch die Unterebenen bei Bedarf einzeln.
    DesWeiteren hätte ich gern noch die Möglichkeit, die entsprechende Struktur als PDF zu speichern.
    Wichtig wäre, dass die Explorerstruktur 1zu1 übernommen wird. Mir ist klar, Strings können nicht nummerisch sortiert werden aber es sollte letztlich so aussehen, wie im Bild erkennbar.

    Es geht mir nicht um fertigen Code aber ich benötige mit Sicherheit viel Unterstützung.

    Welche Möglichkeiten seht ihr, das Projekt umzusetzen?
    Es wäre Klasse, wenn ich erneut auf euch zählen kann.

    MfG Madde
    Bilder
    • Ordnerstruktur.JPG

      64,5 kB, 1.643×601, 44 mal angesehen
    @Madde Gugst Du

    VB.NET-Quellcode

    1. Dim dirs = New DirectoryInfo(START_PFAD).GetDirectories("*.*", SearchOption.AllDirectories)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Zusammen,

    ich habe jetzt folgenden Code, welcher mir die Struktur zwar einliest aber erwartungsgemäß nicht so, wie es letztlich aussehen soll, da hier ja noch einiges fehlt.
    Aktuell liest er alles ein und platziert es in Spalte 1 untereinander.
    Zwei Dinge müssen hier noch verbaut werden.
    1. Die Reihenfolge soll generell wie im Explorer angezeigt, trotz Strings, erhalten bleiben ( 1,2,3,10,20 nicht 1,10,2,20,3)
    2. Die Unterordner sollen ab ihrer Tiefe in die jeweilige Spalte (wie in der Grafik in Post 1 )

    Spalte 1__________Spalte 2

    Oberordner 1
    _________________Unterordner 1
    _________________Unterordner 2
    Oberordner 2
    _________________Unterordner 1
    _________________Unterordner 2

    VB.NET-Quellcode

    1. Dim sPath As String
    2. sPath = "C:\Trennungen nach Ordnerstruktur erstellen\Test"
    3. Dim Dir As New System.IO.DirectoryInfo(sPath)
    4. Dim dirs = New DirectoryInfo(sPath).GetDirectories("*.*", SearchOption.AllDirectories)
    5. For Each Dir In Dirs
    6. dgv.Rows.Add(Dir.Name)
    7. Next


    Habt ihr weitere Vorschläge für mich?
    Ich wäre über detailreiche Infos sehr erfreut.

    MfG Madde
    Dann musst Du die Ebenen einzeln auslesen, nicht mit SearchOption.AllDirectories in einem Rutsch, sondern SearchOption.TopDirectoryOnly rekursiv.
    Da musst Du für jedes Verzeichnis über seine Unterverzeichnisse iterieren.
    Oder Du machst Dir eine entsprechende Sortierfunktion.
    Einen eigenen Sorter brauchst Du eh, wenn Du 1-10-11 usw. sortieren willst: String mit Zahlen im RowChanged-Event korrekt sortieren
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Inhaltlich, denke ich, zu verstehen was gemeint ist aber ich habe leider keinen Ansatz wie ich das umsetzen kann. Wie erwähnt bin ich ja kein Programmierer.
    Was müsste man einbauen, damit nach Erkennen der Unterorder er diese entsprechend in Spalten setzt, sodass, ähnlich einem Treeview, die Ordner in den Spalten angezeigt werden?
    Das mit der Sortierung schaue ich mir an.

    MfG Madde
    @Madde Sieh Dir mal den Post von nikeee13 an:
    TreeView mit Ordnern füllen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich glaube, es wird ein zu komplexes Thema für mich, was mangels Kenntnissen dann einfach nicht umzusetzen ist.
    Da werde ich nicht wirklich vorankommen.
    Trotzdem Danke für den Versuch, mir an Hand von Beispielen, Hinweise gegeben zu haben.

    @RodFromGermany Das Beispiel aus Post 6 funktioniert gut, mal abgesehen von der Sortierung aber das ist ja ein anderes Thema, wenngleich dein Beispiel eines Sorters aus Post 4 bei mir nicht funktioniert.
    Das wird aber sehr wahrscheinlich an mir liegen.

    Solltet ihr noch Beispiele haben, welche noch näher an mein Ziel rücken, dann könnt ihr die gerne mitteilen.

    Eine schöne Restwoche
    MfG Madde
    @Haudruferzappeltnoch Es geht weniger um die Darstellung, sondern mehr um das danach.

    Ziel ist es, eine gesamte Ordnerstruktur, mit allen Unterordnern, einzulesen und deren Bezeichnung als Trennblätter zu drucken. Das Bild in meinem Post ist nur ein sehr einfaches Beispiel. Strukturen um die 800 Ordner/Unterordner sind keine Seltenheit.
    Die Struktur sollte halt komplett druckbar sein oder eben die jeweiligen Ebenen einzeln, also alle Ordner der Unterebene 2 oder Unterbene 2 usw. für sich stehend ebenfalls hintereinander.
    In Excel/Word funktioniert das wunderbar, ist aber eben nicht plattformunabhängig. Deshalb dachte ich, könnte man das in vb.net umsetzen.

    MfG Madde
    Ok wenn es ums Drucken geht in .net, dann muss mans überwiegend selbst machen.
    Als Control nutzt man hierfür das PrintDocument.
    Das hat im PrintPage Event ein Graphics Object das entsprechend bemalt werden kann.

    Und da man das selbst macht ist natürlich die Basisstruktur der Daten vollkommen beliebig.
    @Madde Was funktioniert nicht?
    Wenn Du den TreeView befüllt hast, musst Du doch nur noch über alle Nodes iterieren.
    Zum Drucken gugst Du hier:
    Drucken mehrseitiger Dokumente
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was funktioniert nicht?

    Es funktioniert soweit, dass er die Ordner einliest, allerdings mit der erwartungsgemäß falschen Sortierung. Hier wollte ich dann deinen Code verwenden.
    String mit Zahlen im RowChanged-Event korrekt sortieren
    Ich komme da aber nicht weiter, entweder greift die C&P-Bremse ;) , da er mir viele Zeilen rot untermalt oder ich habe einen grundlegenden Fehler im Code.
    Auffällig war auch, nach Übernahme wurde meine Form gelöscht und durch eine leere ersetzt.

    Wenn Du den TreeView befüllt hast, musst Du doch nur noch über alle Nodes iterieren.

    Ich habe leider keine Ahnung, wie ich das umsetzen kann/soll.
    Vielleicht kann mir ja generell nochmal weitergeholfen werden.

    MfG Madde
    Poste mal Deinen Code und einen Screenshot, auf dem der Fehler dargestellt ist (Code + Beschreibung des Studios).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo

    ich hatte mich getäuscht.
    Das ist der aktuelle Code aus deinem Link. Den Versuch, hier eine Sortierung hinzubekommen, habe ich sein lassen, da das Beispiel auf die Listbox zielte und nicht auf ein Treeview.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Function GetFolders(ByVal Tn As TreeNode, ByVal DirInfo As DirectoryInfo) As TreeNode
    4. If Tn IsNot Nothing AndAlso DirInfo IsNot Nothing Then
    5. Dim dinfos As DirectoryInfo() = DirInfo.GetDirectories()
    6. Tn.Text = DirInfo.Name
    7. If dinfos.Length <> 0 Then
    8. For Each Path As DirectoryInfo In dinfos
    9. Dim SubTn As New TreeNode(Path.Name)
    10. SubTn.Tag = Path
    11. Tn.Nodes.Add(GetFolders(SubTn, Path))
    12. Next
    13. End If
    14. End If
    15. Return Tn
    16. End Function
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. Dim pfad As String
    19. pfad = "C:\Trennungen nach Ordnerstruktur erstellen\Test"
    20. TreeView1.Nodes.Add(GetFolders(New TreeNode(), New DirectoryInfo(pfad)))
    21. End Sub
    22. End Class


    Hier müsste halt jetzt eine Sortierung rein und die Möglichkeit, die Komplettstruktur zu zeigen sowie die Unterebenen einzeln abzufangen.

    MfG Madde

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Madde“ ()

    Madde schrieb:

    VB.NET-Quellcode

    1. Tn.Nodes.Add(GetFolders(SubTn, Path))
    An dieser Stelle musst Du bereits Unteerordner an Child-Nodes zuweisen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Madde schrieb:

    Mir fehlt leider jeglicher Ansatz.
    Erstell zwei neue Testprojekte.
    Im ersten schreibst Du den Inhalt einer Verzeichnis-Liste in eine Textbox:

    VB.NET-Quellcode

    1. For Each Path As DirectoryInfo In dinfos
    2. ' ...
    3. Next
    Im zweiten Projekt lädtst Du Dir aus den Microsoft Docs ein TreeView-Beispiel und experimentierst damit, bis Du verstanden hast, wie ChildNodes hinzugefügt werden.
    Wenn Du beides verstanden hast, setzt Du alles in einem weiteren Projekt zusammen und bist feddich. 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dieser Smiley 8o macht mich jetzt fertig.
    Du schreibst das alles so locker von der Hand ;)
    Natürlich verstehe ich, dass es dir wichtig ist, wenn ich selbst zu einer Lösung komme aber meine Kenntnisse...egal, hatte ich ja schon mehrfach erwähnt.
    Ich werde deinen Hinweis beherzigen und mal schauen wo es mich hinbringt, wenngleich mich, mein durchaus vorhandener Optimismus, da an Grenzen bringen wird ;)

    MfG Madde