Ordner mit Begriff aus Combobox suchen

  • VB.NET

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

    Ordner mit Begriff aus Combobox suchen

    Hallo Zusammen,

    könnt Ihr mich in eine Richtung bringen, ich habe keinen Ansatz.
    Ich möchte Ordner auswählen, die gelöscht werden sollen.

    Vorgegeben ist eine Ordnerstruktur mit Unterordnern in denen sich in den unterschiedlichen Unterordnern jeweils nochmals Unterordner befinden, welche den Monatsnamen tragen.
    Bspw. D:\Kunden\Kunde1\Dezember.

    Mein Ziel ist es, den gewünschten Monat aus einer Combobox auszuwählen und alle Unterordner mit dem gewählten Monatsnamen zu löschen.

    Könnt Ihr mir hierfür Hilfestellungen geben?

    MfG Madde
    Stehen In der ComboBox nur die Monatsnamen? Und wenn Du dann eben März auswählst und dann auf [Löschen] klickst, sollen dann bei allen Kunden die Märzmonatsordner gelöscht werden? Klingt nach einer übersichtlichen Aufgabe. Stichwort Verzeichnissuche. In der dann eben alle Kundenordner durchgehen und schauen, ob sie den Monats-Unterordnerenthalten. Da eine tiefere Suche aufgrund der angegebenen Verzeichnisstruktur nicht notwendig erscheint, könntest Du nach Auffinden eines Ordners diesen auch direkt löschen.
    • ComboBox anlegen
    • mit Monatsnamen befüllen
    • Verzeichnissuche mithilfe IO.DirectoryInfo
    • Verzeichnis löschen auch mit IO.DirectoryInfo
    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.

    VaporiZed schrieb:

    Verzeichnissuche mithilfe IO.DirectoryInfo
    Verzeichnis löschen auch mit IO.DirectoryInfo


    Kannst Du mir diesbezüglich weiterhelfen, ich bin absoluter Anfänger in Sachen Programmierung.

    Hier mein bisheriger Code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub form1_load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    3. ComboBox1.Items.Add("Januar")
    4. ComboBox1.Items.Add("Februar")
    5. ComboBox1.Items.Add("März")
    6. ComboBox1.Items.Add("April")
    7. ComboBox1.Items.Add("Mai")
    8. ComboBox1.Items.Add("Juni")
    9. ComboBox1.Items.Add("Juli")
    10. ComboBox1.Items.Add("August")
    11. ComboBox1.Items.Add("September")
    12. ComboBox1.Items.Add("Oktober")
    13. ComboBox1.Items.Add("November")
    14. ComboBox1.Items.Add("Dezember")
    15. End Sub
    16. Private Sub Combobox1_selectedindexchanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    17. If ComboBox1.SelectedIndex = 0 Then
    18. MessageBox.Show("Es wurde der Monat Januar ausgewählt", "Januar")
    19. End If
    20. If ComboBox1.SelectedIndex = 1 Then
    21. MessageBox.Show("Es wurde der Monat Januar ausgewählt", "Februar")
    22. End If
    23. '...und so weiter
    24. End Sub
    25. End Class

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ComboBox1.Items.Add("Januar")
    5. ComboBox1.Items.Add("Februar")
    6. ComboBox1.Items.Add("März")
    7. ComboBox1.Items.Add("April")
    8. ComboBox1.Items.Add("Mai")
    9. ComboBox1.Items.Add("Juni")
    10. ComboBox1.Items.Add("Juli")
    11. ComboBox1.Items.Add("August")
    12. ComboBox1.Items.Add("September")
    13. ComboBox1.Items.Add("Oktober")
    14. ComboBox1.Items.Add("November")
    15. ComboBox1.Items.Add("Dezember")
    16. End Sub
    17. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    18. Dim path As String = System.IO.Path.Combine(Me.TextBox1.Text, Me.ComboBox1.Text)
    19. Dim verzeichnis As New IO.DirectoryInfo(path)
    20. ' Prüfen ob Verzeichnis vorhanden ist...
    21. If verzeichnis.Exists Then
    22. If MessageBox.Show("Möchten Sie wirklich """ & verzeichnis.FullName & " Löschen?",
    23. Application.ProductName, MessageBoxButtons.YesNo,
    24. MessageBoxIcon.Question) = DialogResult.Yes Then
    25. MsgBox(verzeichnis.FullName) ' <------
    26. End If
    27. Else
    28. MessageBox.Show("Verzeichnis nicht gefunden!")
    29. End If
    30. End Sub
    31. End Class


    Ich hoffe dir hilft das weiter! :)
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Vorab schonmal Danke!
    Prinzipiell bringt mich Dein Code dem Ergebnis näher.
    Leider kann ich aber nur einen Kunden festlegen.
    Ich möchte gern alle Monatsordner gleichzeitig löschen, von allen Kunden.
    D:\Kunde1\Dezember
    D:\Kunde2\Dezember

    Er soll praktisch alle Unterordner aus der "Comboboxauswahl" in allen Kundenordnern suchen und löschen.

    Geht das?

    Edit: Die Struktur ist immer gleich, ergo, der gewünschte Monatsordner kommt immer als 2. Ordner auf dem Laufwerk.
    Vielleicht ist das hilfreich

    MfG Madde

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

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. ' Textbox1 = D:\Temp
    4. ' Textbox2 = KundeX
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim path As String = IO.Path.Combine(Me.TextBox1.Text, Me.TextBox2.Text)
    7. ' Alle Kundenordner auslesen...
    8. For dirs As Integer = 1 To System.IO.Directory.GetDirectories(Me.TextBox1.Text).Length
    9. Dim wert As String = path.Replace(CChar("X"), CChar(dirs.ToString))
    10. If System.IO.Directory.Exists(wert) Then
    11. MsgBox(wert) '<------
    12. End If
    13. Next
    14. End Sub
    15. End Class


    Wenn Pfad "Kunde1" und "Kunde2" usw. dann werden diese aufgelistet! :)
    Visual Basic.NET 8o
    MS-SQL
    8o
    Leider komme ich mit deinem Code nicht klar. Liegt sicher auch daran, dass ich ein totaler Noob bin.
    Wenn ich neben dem Laufwerk auch den Kundenordner angeben muss, hilft mir das irgendwie nicht.
    Es soll ja so sein, dass nur das Laufwerk angegeben werden muss und der Unterordner "Monat" aus der Combobox.
    Der übergeordnete Ordner "Kunde" soll ja praktisch übergangen werden.
    Die Suche soll alle Ordner die den Namen nach Auswahl in der Combobox tragen --> "Januar oder Februar oder März etc" finden.

    MfG Madde
    Also nur das Laufwerk. Ist in dem Laufwerk noch was außer den Kundenordnern? Nicht, dass da irgendwo noch Rechnungsordner sind und die auch mit ner Monatsaufteilung sind und die dann "versehentlich" (durch falschen Code) gelöscht werden. Machen wir es mal anders: Ist die Ordnerstruktur so: X:\Kunden\Y\Monat
    X = Laufwerk, Y = alle möglichen Kundennamen
    oder wie ist es aufgebaut? X soll auswählbar sein, Y soll quasi egal sein (alle durchgehen). Oder ist auch der Teil zwischen X und Y variabel?
    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.
    Das klang im Eingangspost noch anders

    Madde schrieb:

    D:\Kunden\Kunde1\Dezember
    aber macht nix, dann ist das geklärt.
    Hast Du schon ne Laufwerksauswahl?

    VB.NET-Quellcode

    1. Dim SelectedDrive = New IO.DirectoryInfo("D:\")
    2. Dim DirectoriesToDelete As New List(Of IO.DirectoryInfo)
    3. For Each Directory In SelectedDrive.GetDirectories
    4. Try
    5. DirectoriesToDelete.AddRange(Directory.GetDirectories(CbxSelectedMonth.Text, IO.SearchOption.AllDirectories))
    6. Catch UAEx As UnauthorizedAccessException
    7. End Try
    8. Next
    9. For i = DirectoriesToDelete.Count - 1 To 0 Step -1
    10. DirectoriesToDelete(i).Delete(True)
    11. Next

    leider muss das immer etwas verkompliziert werden, da im Stammverzeichnis meist ein NoAccess-Verzeichnis ist. Und Elemente in einer For-Schleife immer von hinten nach vorn löschen, sonst werden Elemente übersprungen.
    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.
    8o

    Sorry, da war mein Eingangsport schlichtweg falsch
    Das läuft jetzt prima durch. Dauert zwar etwas aber das ist Ok.

    So, jetzt werd ich mal unverschämt.
    Da es etwas dauert, würde ich gerne den Benutzer wissen lassen das es etwas dauert. Messagebox wäre das einfachste und Progressbar sicher zu aufwändig.

    Unabhängig davon danke ich dir! Du hast mir sehr geholfen.

    MfG Madde
    Jetzt musst Du nur noch rausfinden, wo der Flaschenhals ist. Beim Löschen oder auch beim Suchen.

    Jetzt wird's schon eine Stufe härter: Nebenläufigkeit. Label1 wird zum Statuslabel, welches anzeigt, das wievielte Verzeichnis gerade gelöscht wird. Übersieh das Async in Zeile#1 nicht! Probieren und verstehen:

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim SelectedDrive = New IO.DirectoryInfo("D:\")
    3. Dim DirectoriesToDelete As New List(Of IO.DirectoryInfo)
    4. For Each Directory In SelectedDrive.GetDirectories
    5. Try
    6. DirectoriesToDelete.AddRange(Directory.GetDirectories(ComboBox1.Text, IO.SearchOption.AllDirectories))
    7. Catch UAEx As UnauthorizedAccessException
    8. End Try
    9. Next
    10. Await Task.Run(Sub()
    11. Dim CurrentDirectoryIndex = 1
    12. For i = DirectoriesToDelete.Count - 1 To 0 Step -1
    13. Label1.Invoke(Sub() UpdateLabelTextWith(CurrentDirectoryIndex, DirectoriesToDelete.Count))
    14. DirectoriesToDelete(i).Delete(True)
    15. Next
    16. End Sub)
    17. Label1.Text = ""
    18. End Sub
    19. Private Sub UpdateLabelTextWith(CurrentDirectoryIndex As Integer, DirectoryCount As Integer)
    20. Label1.Text = $"gelöscht wird Verzeichnis {CurrentDirectoryIndex} von {DirectoryCount}"
    21. End Sub
    Stichworte sind Async/Await und Invoke.
    Es muss nebenläufig gemacht werden, weil sonst keine Daten auf dem Formular aktualisiert werden. Das kann man zwar erzwingen, aber das(?) GUI, also die Benutzeroberfläche wird blockiert und reagiert nicht. Das endet dann nach einer Minute in einer Exception.
    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.
    Hmm, ich bekomme jetzt einige Fehler. Folgend paar Auszüge.

    Fehler 1 "Option Strict On" erfordert, dass alle Variablendeklarationen eine As-Klausel enthalten.
    Fehler 2 "end of"-Anweisung erwartet.
    Fehler 3 "Option Strict On" erfordert, dass alle Variablendeklarationen eine As-Klausel enthalten.
    Fehler 4 Die Anweisung kann nicht außerhalb einer Methode/eines mehrzeiligen lambda-Ausdrucks stehen.
    Welches Framework nutzt Du? Zu finden unter Projekteigenschaften -> Anwendung -> Zielframework
    Hast Du Option Infer On? Zu finden unter Projekteigenschaften -> Kompilieren (oder manuell als erste Zeile in der DateI setzen: Option Infer On)
    Die Zeilennummern für die Fehler wären sinnvoll. Oder Du sagst den Code, bei welcher Zeile die Fehler kommen.
    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.
    Framework 4.6.1
    Option Infer On hab ich jetzt drin

    Await Task.Run(Sub() - hier untermalt er den Task mit dazugehöriger Meldung

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler BC30451 "Task" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich.
    Achso. Ok, Bei mir wurde automatisch der passende Namespace eingebunden.
    Entweder machst Du es
    • vollqualifiziert, indem Du statt Task Threading.Tasks.Task schreibst
    • per Namespaceimport in der Datei, indem Du in die erste Zeile der Datei schreibst Imports Threading.Tasks
    • per Namespaceimport im Projekt: Projekteigenschaften -> Verweise -> bei "Importierte Namespaces" Haken bei System.Threading.Tasks
    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.

    VaporiZed schrieb:

    per Namespaceimport im Projekt: Projekteigenschaften -> Verweise -> bei "Importierte Namespaces" Haken bei System.Threading.Tasks
    Das wär aber schlechter Stil.
    Tasks braucht man nur sehr selten und nur an wenigen Stellen.
    Daher gehört das nicht in die projekt-weiten General-Importe.
    Hallo Zusammen,

    einleitend noch "Gesundes Neues"!

    Ich muss hier noch einmal nachfragen.
    Der Quelltext in Post 10 funktioniert für meine Belange ganz gut. Dies allerdings nur lokal.
    Ist es möglich, dass dies auf einem Netzlaufwerk nicht läuft?
    Lokal läuft es durch ohne einen Fehler zu bringen, auf dem Netzlaufwerk allerdings wirft er den Fehler "Das Verzeichnis ist nicht leer" aus.

    MfG Madde

    EDIT: Kommando zurück, der Ordner den ich Löschen wollte beinhaltete eine Datei, welche in Verwendung war

    *Rot ist nur fürs Forumteam, Farbe geändert*

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Marcus Gräfe“ ()