Unterordner finden und öffnen

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Unterordner finden und öffnen

    Hallo in die Expertenrunde,

    bin im Grunde Laie und könnte ein wenig Hilfe bei meiner Problemlösung brauchen.

    Hier meine Situation:

    Ich habe ein Stammverzeichnis gegeben. In diesem befinden sich Unterordner. z.B. 2019, 2018, 2017, usw.). Dann gibt es in diesen Ordner (z.B. 2019) wiederum die Unterordner A1, B1, C1, usw. Im Ordnee 2018 gibt es die Unterordner A2, B2, C2, usw.

    Wenn ich jetzt in ein Textfeld „B2“ eingebe, soll das Programm den Unterordner B2 suchen und im Windows-Explorer öffnen.

    Beginnen soll dies im aktuellen Jahr 2019. Sollte sich im Ordner „2019“ das Verzeichnis „B2“ nicht befinden, soll es vom Ordner „2019“ in das Verzeichnis „2018“ springen und dort wieder suchen ob ein Verzeichnis mit dem Namen „B2“ zu finden ist. Hier sollte es dann fündig werden und das entsprechende Verzeichnis im Windows explorer öffnen.

    Hoffe ihr versteht mein Problem und könnt mir weiterhelfen.

    Danke bereits im Voraus
    Willkommen im Forum.
    Dann schau nach rekursiver Datei- und/oder Ordnersuche im Forum, nutze z.B. diesen Thread vom EdR und arbeite dann mit z.B. Process.Start(), um den Ordner im Explorer zu öffnen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @SpecialUser Ebenfalls Willkomemn im Forum. :thumbup:
    Du hast doch im Prinzip den Algo bereits aufgeschrieben.

    Quellcode

    1. Gehe ins Jahr 2019 und suche den Ordner. Vorhanden => öffnen.
    2. Nein:
    3. Gehe ein Jahr zurück und suche den Ordner. Vorhanden => öffnen.
    4. Nein:
    5. Gehe ein Jahr zurück und suche den Ordner. Vorhanden => öffnen.
    6. ...
    Nun musst Du das nur noch in Code gießen.
    Äußere Schleife über die Jahre,
    innerer Befehl der Verzeichnis-Suche.
    Öffnen.
    Feddich.
    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!
    @SpecialUser So was:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim Startordner = "c:\Temp\___Testordner" ' das ist mein Test-Verzeichnis für Dein Problem
    5. For jahr = 2019 To 2016 Step -1
    6. Dim di = New DirectoryInfo(Startordner & "\" & jahr)
    7. If di.GetDirectories(TextBox1.Text).Length > 0 Then
    8. MessageBox.Show("gefunden in " & jahr)
    9. End If
    10. Next
    11. End Sub
    12. End Class
    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!
    @SpecialUser Genau.
    Wie kann eine Schleife beendet werden?
    Das wäre Deine Hausaufgabe.
    ====
    Liebe Forumskollegen, lasst das SpecialUser allein rauskriegen.
    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!
    :D Also beendet habe ich die Schleife mit einem einfachen "Exit For". Ging leichter als gedacht.

    Nur habe ich jetzt noch eine Problemstellung: Wenn jetzt die Schleife alle Ordner (2019, 2018, 2017, ...) durchlaufen hat, aber jedoch nichts findet? Wie gebe ich das dann aus?
    Wir gehen jetzt davon aus, dass sich der gesuchte Ordner nicht im Ordner 2019 befindet sondern im Ordner 2018.

    Denn wenn ich bei der If-Abfrage wie im Post 5 noch anpasse und ein Else anfüge, erhalte ich zuerst eine MessageBox für den Ordner 2019, dass nichts gefunden wurde und anschließend eine MessageBox dass sich das gesuchte Verzeichnis im Ordner befindet.

    Hier noch der Code der Anpassung:

    VB.NET-Quellcode

    1. ​If di.GetDirectories(TextBox1.Text).Length > 0 Then
    2. MessageBox.Show("gefunden in " & jahr)
    3. Else
    4. MessageBox.Show("NICHTS GEFUNDEN")
    5. End If


    Und wenn ich die ganze Schleife in eine übergeordnete If-Abfrage stecke, stelle ich mir die Frage wie ich in der If-Abfrage Bezug auf die Schleife nehmen kann?

    SpecialUser schrieb:

    Wie gebe ich das dann aus?
    Mach eine Funktion vom Typ Boolean draus.
    Hast Du gefunden, was Du suchst, machst Du statt Exit For => Return True in der inneren Schleife,
    ansonsten Return False nach der Schleife.
    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!

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. If Not GesuchterOrdnerIstVorhanden() Then Exit Sub
    3. 'hier weiterer Code, der durchgeführt werden soll, wenn der gesuchte Ordner existiert
    4. End Sub
    5. Private Function GesuchterOrdnerIstVorhanden() As Boolean
    6. Dim Startordner = "c:\Temp\___Testordner"
    7. For jahr = 2019 To 2016 Step -1
    8. Dim di = New DirectoryInfo(Startordner & "\" & jahr)
    9. If di.GetDirectories(TextBox1.Text).Length > 0 Then Return True
    10. Next
    11. Return False
    12. End Function

    Das ließe sich eben noch ausbauen, indem man der Function die möglichen Jahre, den Startordnernamen und den zu suchenden Ordnernamen als Parameter übergibt. Macht die Function unabhängiger/flexibler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    naja, vor allem sollte die Funktion den gefundenen Ordner denn auch returnen.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. dim di = SucheOrdner(Textbox1.Text)
    3. if di is Nothing then Messagebox.Show("denn eben nich!"): Return
    4. 'hier weiterer Code, der durchgeführt werden soll, wenn der gesuchte Ordner gefunden wurde
    5. End Sub
    6. Private Function SucheOrdner(name as string) As DirectoryInfo
    7. Dim Startordner = "c:\Temp\___Testordner"
    8. For jahr = 2019 To 2016 Step -1
    9. Dim di = New DirectoryInfo(Startordner & "\" & jahr & "\" & name)
    10. If di.Exists Then Return di
    11. Next
    12. Return Nothing
    13. End Function

    So, jetz hamwa doch alles vorgesagt.
    Finde ich nicht soo wild, grad blutige Anfänger muss man glaub erst auf Ideen bringen, was man mit Parametern und Return-Werten alles anstellen kann.

    Ich komm hier gleich mal mitm Link zum Selbst-Studium: msdn.microsoft.com/de-de/library/dd409611(v=vs.140).aspx
    Lies dir unbedingt die Schlüsselworte durch, die wir dir gezeigt haben, ohne sie zu erklären - nämlich Exit, Return, Is und Nothing (glaubt man garnet, was alles in so paar Zeilen steckt).
    Wie gesagt: Unbedingt nachlesen. ZB Exit und Return sind teils ähnlich, teils sehr unterschiedlich.
    Wenn du dich da nicht schlau machst, bleibst du dumm.
    Ach - und noch eine Tücke: Im gegebenen Link ist Exit richtig einsortiert, aber idiotischerweise auf Deutsch übersetzt ("Beenden").
    Ich könnte natürlich auch die Englische Übersicht anliefern, aber dann wären auch die Erläuterungen auf englisch.

    Und hier noch ein, weil ich "Parameter" gesagt habe, ohne zu erklären: Grundlagen: Fachbegriffe

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