Namen von Subfolder in Listbox ausgeben aber nicht deren Subfolder

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Fortender.

    Namen von Subfolder in Listbox ausgeben aber nicht deren Subfolder

    Wie kann ich machen dass nur Subfolder aus aus einem Verzeichnis in einer Listbox ausgegeben werden aber nicht deren Subfolder.

    So werden alle Subfolder ausgegeben:

    VB.NET-Quellcode

    1. For Each Ordner In My.Computer.FileSystem.GetDirectories(PATH, FileIO.SearchOption.SearchAllSubDirectories)
    2. ListBox1.Items.Add(Ordner)
    3. Next


    Quellcode-Tag an VB.NET angepasst. ~Trade

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

    1. Den My-Namespace am besten so gut wie es geht meiden! Vor allem FileSystem
    2. Mach es mit IO.

    Ich würde mir eine DirectoryInfo anlegen und dann die Unterordner auslesen.
    Allerdings darf der Import nicht fehlen:

    VB.NET-Quellcode

    1. Imports System.IO​

    Beispiel:

    VB.NET-Quellcode

    1. Dim folderInfo As New DirectoryInfo("Ordnerpfad")
    2. For Each folder As DirectoryInfo In folderInfo.GetDirectories()
    3. ListBox1.Items.Add(folder.Name)
    4. Next

    Wenn du nicht weitere Informationen der Ordner brauchst kannst du auch per IO.Directory.GetDirectories() nur Strings holen.
    Beispiel:

    VB.NET-Quellcode

    1. For Each folder As String In Directory.GetDirectories("Ordnerpfad")
    2. ListBox1.Items.Add(folder)
    3. Next


    ABER: Wieso stellst du die Daten nicht in nem ordentlichen Datenmodell dar? Du könntest die ListBox einfach an eine DirectoryInfo-Liste binden und schon hättest du dir paar Zeilen Code sparen können.
    Im Designer also direkt an DirectoryInfo binden und per DataSource-Eigenschaft der ListBox die New IO.DirectoryInfo("Ordnerpfad").GetDirectories() setzen.

    MfG Tim
    Also

    VB.NET-Quellcode

    1. For Each folder As String In Directory.GetDirectories("Ordnerpfad")
    2. ListBox1.Items.Add(folder)
    3. Next

    sollte dir aber mit Option Strict On um die Ohren fliegen.
    Denn GetDirectories wirft DirectoryInfos zurück und die kann man nicht in String casten!
    Auch MUSS man nicht System.IO importieren. Es ist lediglich bequemer. Ansonsten müsste man schreiben

    VB.NET-Quellcode

    1. For Each folder In New System.IO.DirectoryInfo("C:\Temp").GetDirectories("*", System.IO.SearchOption.TopDirectoryOnly)
    2. ListBox1.Items.Add(folder.Name)
    3. Next


    Der Import sorgt nur dafür dass du es ab dato nicht mehr schreiben musst und direkt auf die Inhalte von System.IO zugreifen kannst.

    Es würde auch tun:

    VB.NET-Quellcode

    1. ListBox1.DataSource = New System.IO.DirectoryInfo("C:\Temp").GetDirectories("*", System.IO.SearchOption.TopDirectoryOnly)
    2. ListBox1.DisplayMember = "Name"


    Oder aber, einmal

    VB.NET-Quellcode

    1. Imports System.IO​

    und dann

    VB.NET-Quellcode

    1. ListBox1.DataSource = New DirectoryInfo("C:\Temp").GetDirectories("*", SearchOption.TopDirectoryOnly)
    2. ListBox1.DisplayMember = "Name"
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    @MemoAnMichSelbst
    Nein. Schau dir die Deklaration an auf msdn:

    VB.NET-Quellcode

    1. 'Declaration
    2. Public Shared Function GetDirectories ( _
    3. path As String _
    4. ) As String()


    Sieht für mich richtig aus ;)
    Die DirectoryInfo-Klasse hat die selbe Funktion nur gibt die eben DirectoryInfo[] zurück. IO.Directory.GetDirectories gibt String[] zurück wie in der Deklaration gezeigt.
    ja, hast recht.
    dennoch würde ich von String-Gewurstel abraten, und die Info-Dinger nehmen, einfach, weil die viel mehr Information fertig aufbereitet bereithalten. Ist bisserl um die Ecke, sich erst lauter Strings zu holen, und dann aus den Strings DirectoryInfos zu bilden - wie du es vorschlugst.
    Warum nicht gleich DirectoryInfos holen?

    Und es soll ja in eine Listbox (post#1) - also typischer Fall für das Databinding wie in Keine Strings in die File-Listbox!
    Nur will er's nicht rekursiv, aber das macht die Sache ja nur umso einfacher.
    Wenn er nur die Directories eines Directory haben will, dann wäre das doch wirklich mit meinem letzten Code abgehandelt.
    Wenn er den Ordner angibt und sagt es sollen nur die TopDirectory gegeben werden, hat er ja die Subdirectories seines Directory... und die gebunden an die Liste mit DisplyMember = "Name" zeigt doch deren Namen an und alles gut.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Hab ich doch alles in meinem post abgehandelt. Beste variante ist eben einfach ne List<DirectoryInfo> an die DataSource zu binden und den DisplayMember auf den Namen umstellen. Aber da er vermutlich Anfänger ist, wird er nicht auf uns hören und den für ihn logischen Weg wählen. Und das ist eben das String-Gefriemel