Hilfe beim lernen Klasse File und Directory

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von mali.

    Hilfe beim lernen Klasse File und Directory

    Moin, wie es die Überschrift hoffentlich schon aussagt, beschäftige ich mich mit der Klasse File und Directory. Und zwar arbeite ich mit dem Code aus dem Galileo Open Book und habe ihn bisher so auf meine Bedürfnisse angepasst bzw. probiere aus, wie was gemacht wird.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. If Directory.Exists("E:\Music") Then
    3. Directory.SetCurrentDirectory("E:\Music")
    4. Dim Verzeichnis As String
    5. Dim Dateiliste() As String
    6. Dim i As Integer
    7. Verzeichnis = Directory.GetCurrentDirectory()
    8. Dateiliste = Directory.GetFileSystemEntries(Verzeichnis)
    9. ListBox1.Items.Clear()
    10. For i = 0 To Dateiliste.Count - 1
    11. ListBox1.Items.Add(My.Computer.FileSystem.GetName(Dateiliste(i)))
    12. Next
    13. End If
    14. ListBox1.ForeColor = Color.Blue
    15. ListBox1.BackColor = Color.Black
    16. End Sub
    17. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    18. If File.GetAttributes(ListBox1.Text) = FileAttributes.Directory Then
    19. Directory.SetCurrentDirectory(ListBox1.Text)
    20. Dim Verzeichnis As String
    21. Dim Dateiliste() As String
    22. Dim i As Integer
    23. Verzeichnis = Directory.GetCurrentDirectory()
    24. Dateiliste = Directory.GetFileSystemEntries(Verzeichnis)
    25. ListBox1.Items.Clear()
    26. ListBox1.Items.Insert(0, "...")
    27. For i = 0 To Dateiliste.Count - 1
    28. ListBox1.Items.Add(My.Computer.FileSystem.GetName(Dateiliste(i)))
    29. Next
    30. End If
    31. Label1.Text = Directory.GetCurrentDirectory & "\" & ListBox1.Text
    32. End Sub


    Mit dem code in der Form Load werden mir einmal alle Dateien und Verzeichnisse aufgelistet und wenn der Klick in der Listbox erfolgt und es sich bei dem Item um ein Verzeichnis handelt wird die Prozedur wiederholt.

    So jetzt zu einem meiner Probleme, ich will jetzt nur mp3 angezeigt bekommen. Grundsätzlich hätte ich jetzt den Code in beiden Ereignissen so umgeschrieben

    VB.NET-Quellcode

    1. Dateiliste = Directory.GetFileSystemEntries(Verzeichnis, "*.mp3")


    Das ganze klappt auch, solange ich einen Ordner auswähle und tiefer in die Verzeichnishirachie gehe, aber sobald ich ein Verzeichnis hoch wechsel wird mir nichts mehr angezeigt. Und hier endet mein Verständnis. Vielleicht hat mal wieder jemand Lust im Forum mir weiter zu helfen. Im Voraus schon einmal vielen Dank.
    Ohne das nachzuvollziehen, warum steht der Code in fer Form_Load? Pack ihn in eine Button_Click, da kannst Du besser experimentieren und ihn beliebig oft ausführen.
    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!
    Fang mal so an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Dateiliste() As String = System.IO.Directory.GetFiles(DEIN_PFAD, "*.mp3", System.IO.SearchOption.AllDirectories)
    3. For i = 0 To Dateiliste.Count - 1
    4. ListBox1.Items.AddRange(Dateiliste)
    5. Next
    6. End Sub
    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!
    Damit hab ich schon gearbeitet und damit suche ich ja alle mp3's in einem Pfad inkl. Unterordner. Aber ich will ja zwischen den Ordnern "wandern" und dann sollen nur die MP3's in dem Ordner, in dem ich gerade bin, rausgesucht werden. Trotzdem danke.
    Dann entwickle ein wenig Eigeninitiative und tue es.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. 'Dim Dateiliste() As String = System.IO.Directory.GetFiles(DEIN_PFAD, "*.mp3", System.IO.SearchOption.AllDirectories)
    3. Dim Dateiliste() As String = System.IO.Directory.GetFiles(DEIN_PFAD, "*.mp3", System.IO.SearchOption.TopDirectoryOnly)
    4. For i = 0 To Dateiliste.Count - 1
    5. ListBox1.Items.AddRange(Dateiliste)
    6. Next
    7. End Sub
    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!
    Die Klassen Directory und File sind eiglich nur für sehr oberflächliche InformationsAbfragen geeignet.
    Sobald man mehr als nur Dateinamen erfahren will, arbeitet man besser mit DirectoryInfo / FileInfo.

    (passt zu meine schlechte Meinung übers Galileio-Openbook - besser dieses Buch Lesen)
    @ ErfinderDesRades: Danke für die Info, da es hier aber wirklich nur darum geht, die Dateinamen zu erfahren, bringt mich dies nicht weiter. Jedoch wird mir dies sicherlich bei anderer Gelegenheit weiter helfen. :thumbsup:

    @RodFromGermany: Ich glaube, wir beide reden aneinander vorbei. Ich will die MP3's Ordner für Ordner anzeigen lassen, also müssen auch die Unterordner angezeigt werden. Ich will nicht alles nach MP3's durchsuchen, sondern Ordner für Ordner. Tut mir leid, falls ich dies missverständlich erläutert habe.

    Aber ich glaube zu verstehen, worin der Fehler liegt. Da ich ja so nach MP3's selektiere

    VB.NET-Quellcode

    1. Dateiliste = Directory.GetFileSystemEntries(Verzeichnis, "*.mp3")


    und wenn ich ins Hauptverzeichnis zurück gehe und da keine MP3's vorhanden sind, zeigt er mir auch nichts mehr an. Nicht mal die Ordner.
    Nur hab ich die Lösung noch nicht.
    Du bekommst ja auch keine fertigen Lösungen für nicht genannte Probleme.
    Nimm die Vorschläge und experimentiere ein wenig rum. Das ist doch nicht zu viel verlangt. Oder? :thumbsup:
    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!
    naja das problem ist ganz einfach, ich schaffe es nicht, meinen Code so zu Schreiben das mir die Ordner und Unterordner angezeigt werden und in diesen, wenn sie selektiert werden, nur nach mp3's gesucht wird. aber vielleicht hab ich das ganze ja falsch angegangen, so dass es mit dem code nicht möglich ist. Fertige Lösungen bzw. Codes sind bei mir nie gefragt, ich brauche nur immer denkanstöße. Aber gut, dass versuchst du wahrscheinlich bei mir, mich auf den richtigen pfad zu bringen :D
    Du musst realisieren:
    1. Ausgabe aller Unterordner in einem Verzeichnis UND Ausgabe aller MP3s
    2. Wechseln des Verzeichnisses (in einen Unterordner rein oder im das Parent-Verzeichnis) und dort 1. und 2.
    usw.
    Trenne beide Teilaufgaben sauber voneinander und überlege, wie Du sie realisieren willst.
    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!
    Nun ja, ich hab mir eigentlich jetzt vorgestellt, dass ich Punkt 1 eigentlich mit ner for each schleife ganz gut mach könnte. das klappt auch soweit.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. If Directory.Exists("E:\Music") Then
    3. Directory.SetCurrentDirectory("E:\Music")
    4. ListBox2.Items.Clear()
    5. For Each Ordner As String In Directory.GetDirectories("E:\Music")
    6. ListBox2.Items.Add(My.Computer.FileSystem.GetName(Ordner))
    7. Next
    8. For Each Datei As String In Directory.GetFiles("E:\Music", "*.mp3")
    9. ListBox2.Items.Add(My.Computer.FileSystem.GetName(Datei))
    10. Next
    11. End If
    12. Label1.Text = Directory.GetCurrentDirectory
    13. End Sub


    Und wenn ich ein Verzeichnis anklicke, sucht der darin weiter, allerdings wieder nur die dateien, keine Ordner und das kapiere ich einfach nicht. aber erstmal der code

    VB.NET-Quellcode

    1. Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
    2. If File.GetAttributes(ListBox2.Text) = FileAttributes.Directory Then
    3. Directory.SetCurrentDirectory(ListBox2.Text)
    4. ListBox2.Items.Clear()
    5. For Each Ordner As String In Directory.GetCurrentDirectory()
    6. ListBox2.Items.Add(My.Computer.FileSystem.GetName(Ordner))
    7. Label1.Text = Directory.GetCurrentDirectory
    8. Next
    9. For Each Datei As String In Directory.GetFiles(Label1.Text, "*.mp3")
    10. ListBox2.Items.Add(My.Computer.FileSystem.GetName(Datei))
    11. Next
    12. ListBox2.Items.Insert(0, "...")
    13. End If
    14. Label1.Text = Directory.GetCurrentDirectory & "\" & ListBox2.Text
    15. End Sub


    Folgende Probleme: 1. Zeigt keine Ordner an. 2. In der Listbox wird mir der aktuelle Pfad senkrecht mit angezeigt, wieso? 3. wenn ich die ... anklicke, springt er einen ordner hoch, führt aber keine neue suche durch, dass hat beim 1. versuch geklappt. Frage: wie kann ich dem nachhelfen? mit einer if variablen?

    Als erstes, wäre nett, wenn du mir kurz info geben kannst, ob es überhaupt sinn macht, mit diesem beispiel weiterzuarbeiten und wenn ja, was ich vergesse zu bedenken, damit die fehler ausbleiben.

    In jedem fall, danke für die Beiträge. :thumbsup:

    EDIT: Oh man, bin ich ein Idiot. Hab alle fehler behoben mit nur einer kleinen Änderung.

    VB.NET-Quellcode

    1. For Each Ordner As String In Directory.GetDirectories(Label1.Text)


    Weiss auch nicht, warum ich da vorher GetCurrentDirectory drin hatte. Man kann es sich auch selber schwer machen.

    Aber eine Frage hätte ich noch, weil ich nicht weiß, wie man sowas realisieren kann.

    Ich will, dass die Listbox2.items.insert(0, "...") verschwindet, wenn ich im Ausgangsordner (E:\Music) bin. Hast du vielleicht ein Tipp für mich, wie ich sowas angehe?

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

    Wenn Du einen Code mehrmals aufrufen willst, packe ihn in eine separate Prozedur, nicht aber in die Form_Load().
    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 könnte dich gerade knutschen :rolleyes: der Hinweis hat gleich auch mein letzten Problem gelöse. Aber ne frage hab ich noch. Bei meiner Function wird diese Warnung ausgespuckt:

    Von der Funktion "GetFolderandFiles" wird nicht in allen Codepfaden ein Wert zurückgegeben. Wenn das Ergebnis verwendet wird, kann zur Laufzeit eine NULL-Verweisausnahme auftreten.

    Hier mal anbei meine Function. Die erste, die ich geschrieben habe, also könnten ein paar Fehler drin sein, auch wenn die Function an sich funktioniert.

    VB.NET-Quellcode

    1. Private Function GetFolderandFiles()
    2. For Each Ordner As String In Directory.GetDirectories(Label1.Text)
    3. ListBox2.Items.Add(My.Computer.FileSystem.GetName(Ordner))
    4. Label1.Text = Directory.GetCurrentDirectory
    5. Next
    6. For Each Datei As String In Directory.GetFiles(Label1.Text, "*.mp3")
    7. ListBox2.Items.Add(My.Computer.FileSystem.GetName(Datei))
    8. Next
    9. If Label1.Text = "E:\Music" Then
    10. 'do nothing
    11. Else
    12. ListBox2.Items.Insert(0, "...")
    13. End If
    14. End Function
    Mach da entweder eine Sub draus:

    VB.NET-Quellcode

    1. Private Sub GetFolderandFiles() ' dies ist in Deinem Fall sinnvoller
    2. ' ...
    3. End Sub
    4. ' oder
    5. Private Function GetFolderandFiles() As IRGENDETWAS ' String oder Boolean
    6. ' ...
    7. Return True
    8. End Function
    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!