search Option (alle Verzeichnisse und nur ein Verzeichniss)

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von noboc.

    search Option (alle Verzeichnisse und nur ein Verzeichniss)

    Hallo zusammen,

    ich habe noch ein Problem mit meiner Suchenfunktion.

    Ich setze den Pfad zum suchen so:

    VB.NET-Quellcode

    1. Private Sub ReklamamtionToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReklamamtionToolStripMenuItem.Click
    2. Pfad = "Y:\GV Arbeitsgruppen\Qualität AL\AbweichungsmeldungAL1\Meldung\Reklamation\"
    3. If Not Pfad.EndsWith("\") Then
    4. Pfad &= "\"
    5. End If
    6. Me.ToolStripStatusLabel1.Text = Pfad
    7. End Sub

    danach Frage ich die Datein ab und setze sie in eine Listbox

    VB.NET-Quellcode

    1. Private Sub SuchenToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SuchenToolStripMenuItem1.Click
    2. Dim datei As String
    3. Dim s As String = "*" & Me.ToolStripTextBox1.Text & "*"
    4. Me.ListBox1.Items.Clear()
    5. If Me.ToolStripTextBox1.Text = "" And Me.ToolStripTextBox1.Enabled = True Then
    6. MsgBox("Kein Suchbegriff eingegeben!", MsgBoxStyle.Critical, "Achtung")
    7. ElseIf Me.ToolStripTextBox1.Enabled = False Then
    8. MsgBox("Zuerst einen Suchpfad auswählen", MsgBoxStyle.Critical, "Achtung")
    9.  
    10. Else
    11. For Each datei In My.Computer.FileSystem.GetFiles(Pfad, FileIO.SearchOption.SearchTopLevelOnly, s)
    12. datei = IO.Path.GetFileName(datei)
    13. Me.ListBox1.Items.Add(datei)
    14. Label1.Text = "Anzahl Files: " & ListBox1.Items.Count.ToString
    15.  
    16. Next
    17. If ListBox1.Items.Count < 1 ThenMsgBox("Es wurde nichts gefunden", MsgBoxStyle.Information, "Meldung")
    18. End If
    19. End If
    20. End Sub

    Das funktioniert soweit auch gut,da der Pfad eindeutig ist und die Suche sich auf diesen einen Ordner beschränkt.
    Jedoch gibt es noch einen Pfad der mehrere Unterordner hat. Dann müsste die SearchOption ja auf alle Verzeichnisse angewandt werden. Da ich aber nur einen Button für die Suche habe, weiß ich leider nicht wie man das machen kann??
    Außerdem kann es vorkommen , das die vorgewählten Pfade nicht vorhanden sind, dann bekomme ich bei der Suche eine Fehlermeldung "Darf nicht null sein..."
    Wie lässt sich vor dem suchen überprüfen ob der Pfad überhaupt existiert?
    Ich hoffe ihr könnt mir helfen. Bin in sachen VB leider noch ein totaler anfänger :wacko:
    LG Noboc

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „noboc“ ()

    Könntest du mal deinen Code so formatieren, dass er funktioniert/leserlich ist?
    Das Suchen von Dateien/Ordnern in Unterverzeichnissen kann man z.B. über eine Funktion machen, die sich selber aufruft (rekursiv).

    z.B. so:

    Code

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim mypath As String = "C:\Dein_Pfad"
    3. Dim ListOfFiles As New List(Of FileInfo)
    4. CollectInfo(mypath, ListOfFiles)
    5. For Each fi As FileInfo In ListOfFiles
    6. Debug.WriteLine(fi.Name)
    7. Next
    8. End Sub
    9. Private Sub CollectInfo(ByVal path As String, ByRef FileInfoList As List(Of FileInfo))
    10. Dim fileinfos As FileInfo()
    11. Try
    12. fileinfos = New DirectoryInfo(path).GetFiles("*")
    13. Catch ex As System.UnauthorizedAccessException
    14. Debug.WriteLine("Cannot list files in " & path)
    15. Exit Sub
    16. End Try
    17. For Each File As FileInfo In fileinfos
    18. FileInfoList.Add(File)
    19. Next
    20. For Each dir As DirectoryInfo In New DirectoryInfo(path).GetDirectories
    21. CollectInfo(dir.FullName, FileInfoList)
    22. Next
    23. End Sub
    Nochmal mein Problem

    ich suche in vorgegebenen Pfaden nach Dateien mit "FileIO.SearchOption.SearchTopLevelOnly"
    das funktioniert auch gut, jedoch gibt es auch Pfade wo die gesuchten Datein in Unterordnern stehen können.

    Um diese zu durchsuchen müsste ich das ja mit "FileIO.SearchOption.SearchAllSubDirectories" machen.

    Da ich nur einen Button für die Suche verwende weiß ich leider nicht wie man das machen kann??

    Außerdem war da noch die Frage, wenn ein vorgegebener Pfad nicht existiert, dieses abzufangen??

    LG
    Noboc

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

    Sieh Dir mal den FolderBrowserDialog an, dessen Rückgabewert ist ein Pfad, dann brauchst Du noch eien CheckBox, ob Unterverzeichnisse Ja/Nein untersucht werden sollen.
    Fertich.
    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!
    Ok den Pfad überprüfe ich nun beim setzen mit

    VB.NET-Quellcode

    1. If My.Computer.FileSystem.DirectoryExists


    Das geht schon mal...

    Bleibt das Problem mit dem Suchen

    Sieh Dir mal den FolderBrowserDialog an, dessen Rückgabewert ist ein Pfad, dann brauchst Du noch eien CheckBox, ob Unterverzeichnisse Ja/Nein untersucht werden sollen.
    Fertich.


    Das verstehe ich nicht

    noboc schrieb:

    Außerdem kann es vorkommen , das die vorgewählten Pfade nicht vorhanden sind,
    So hast Du die Sicherheit, dass immer ein Pfad da ist:

    VB.NET-Quellcode

    1. [vb] If Me.FolderBrowserDialog1.ShowDialog <> Windows.Forms.DialogResult.OK Then
    2. Return
    3. End If
    4. Dim pfad As String = Me.FolderBrowserDialog1.SelectedPath
    5. Dim dirOption As IO.SearchOption = IO.SearchOption.TopDirectoryOnly
    6. If Me.CheckBox1.Checked Then
    7. dirOption = IO.SearchOption.AllDirectories
    8. End If
    9. For Each fi In New System.IO.DirectoryInfo(pfad).GetFiles("*.*", dirOption)
    10. ' mit fi was tun
    11. Next
    [/vb]
    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 bekomme das irgendwie nicht hin.

    Was ich machen will ist,
    die FileIO.searchOption bei der Pfadauswahl setzen und dann in der Suche so einstellen...
    Nur leider weiß ich immer noch net wie

    Den Pfad stelle ich folgendermaßen ein, durch Klick :

    VB.NET-Quellcode

    1. Private Sub Al2ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. Pfad = "Y:\Band\AL1\Bandprotokoll AL2\"
    3. If My.Computer.FileSystem.DirectoryExists("Y:\Band\AL1\Bandprotokoll AL2\") Then
    4. Me.ToolStripStatusLabel1.Text = Pfad
    5. Else
    6. MsgBox("Der Pfad ist entweder nicht vorhanden, oder Sie haben keine Berechtigung zum Zugriff. Bitte wenden Sie sich an ihren Administrator!", MsgBoxStyle.Critical)
    7. End If
    8. If Not Pfad.EndsWith("\") Then
    9. Pfad &= "\"
    10. End If
    11. End Sub


    dann wird ein Suchbegriff in eine Textfeld eingegeben und die Suche ausgeführt:

    VB.NET-Quellcode

    1. Private Sub SuchenToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SuchenToolStripMenuItem1.Click
    2. Dim datei As String
    3. Dim s As String = "*" & Me.ToolStripTextBox1.Text & "*"
    4. Me.ListBox1.Items.Clear()
    5. If Me.ToolStripTextBox1.Text = "" And Me.ToolStripTextBox1.Enabled = True Then
    6. MsgBox("Kein Suchbegriff eingegeben!", MsgBoxStyle.Critical, "Achtung")
    7. ElseIf Me.ToolStripTextBox1.Enabled = False Then
    8. MsgBox("Zuerst einen Suchpfad auswählen", MsgBoxStyle.Critical, "Achtung")
    9. Else
    10. For Each datei In My.Computer.FileSystem.GetFiles(Pfad, FileIO.SearchOption.SearchTopLevelOnly, s)
    11. datei = IO.Path.GetFileName(datei)
    12. Me.ListBox1.Items.Add(datei)
    13. Label1.Text = "Anzahl Files: " & ListBox1.Items.Count.ToString
    14. Next
    15. If ListBox1.Items.Count < 1 Then
    16. MsgBox("Es wurde nichts gefunden", MsgBoxStyle.Information, "Meldung")
    17. End If
    18. End If
    19. End Sub
    20. End Class

    noboc schrieb:

    VB.NET-Quellcode

    1. MsgBox("Der Pfad ist entweder nicht vorhanden, oder ... ")
    Füge ggf. nach einer solch (für den Programmablauf) negativen Meldung ein

    VB.NET-Quellcode

    1. Return
    ein, sonst fliegt Dir Dein Programm um die Ohren.

    noboc schrieb:

    If Me.ToolStripTextBox1.Text = "" And Me.ToolStripTextBox1.Enabled = True Then
    Solche Abfragen sind suboptimal, führe lieber ein Flag ein, das diesen Zustand beschreibt.
    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!

    noboc schrieb:

    Ich bitte um Hilfe bei der Filesearchoption (siehe oben)
    Beschreibe doch bitte mal Dein Problem so, dass Du nicht missverstanden werden kannst. :S
    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!
    Also:

    ich setze vor der Eingabe des Suchbegriffs einen Pfad fest.(durch Klick auf einen Button) und übergebe den an eine Textbox

    Den lese ich dann aus der Textbox bei der Suche aus (dabei ist die Filesearchoption für Top Level verzeichnis angegeben)

    nun möchte ich aber einen Pfad setzen, der mehrere Unterordner hat

    Diesen müsste ich dann in der Suche aber mit der FileSearchOption alle Verzeichnisse ausführen.

    bei der Suche soll erkannt werden welcher Pfad gesetzt ist und dann danach die Searchoption gesetz werden

    LG
    Noboc

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

    IOFilesearchoption setzen über checkbox funktioniert nicht

    Habe nun versucht es über eine Check Box zu lösen, jedoch bekommen ich da eine Fehlermeldung in Zeile 20:"Der Wert des Arguments searchType (1) ist für den Enumerationstyp SearchOption ungültig."

    VB.NET-Quellcode

    1. Private Sub SuchenToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SuchenToolStripMenuItem1.Click
    2. Dim datei As String
    3. Dim s As String = "*" & Me.ToolStripTextBox1.Text & "*"
    4. Dim dirOption As IO.SearchOption = IO.SearchOption.TopDirectoryOnly
    5. If Me.Suchoption.Checked Then
    6. dirOption = IO.SearchOption.AllDirectories
    7. End If
    8. Me.ListBox1.Items.Clear()
    9. If Me.ToolStripTextBox1.Text = "" And Me.ToolStripTextBox1.Enabled = True Then
    10. MsgBox("Kein Suchbegriff eingegeben!", MsgBoxStyle.Critical, "Achtung")
    11. ElseIf Me.ToolStripTextBox1.Enabled = False Then
    12. MsgBox("Zuerst einen Suchpfad auswählen", MsgBoxStyle.Critical, "Achtung")
    13. else
    14. For Each datei In My.Computer.FileSystem.GetFiles(Pfad, dirOption, s)
    15. datei = IO.Path.GetFileName(datei)
    16. Me.ListBox1.Items.Add(datei)
    17. Label1.Text = "Anzahl Files: " & ListBox1.Items.Count.ToString
    18. Next
    19. If ListBox1.Items.Count < 1 Then
    20. MsgBox("Es wurde nichts gefunden", MsgBoxStyle.Information, "Meldung")
    21. End If
    22. End If
    23. End Sub
    24. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „noboc“ ()

    machma My.Computer.FileSystem.GetFiles weg und nimm

    VB.NET-Quellcode

    1. For Each fi In New System.IO.DirectoryInfo("PFAD").GetFiles("*.*", IO.SearchOption.AllDirectories)
    2. Next
    Hatten wir bereits in Post #6 X(
    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!
    So ich habe nun das mit der Option hinbekommen.
    Habe es wie fogt gemacht:

    VB.NET-Quellcode

    1. Private Sub SuchenToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SuchenToolStripMenuItem1.Click
    2. Dim s As String = "*" & Me.ToolStripTextBox1.Text & "*"
    3. Dim dirOption As IO.SearchOption = IO.SearchOption.TopDirectoryOnly
    4. Dim op As String = ToolStripStatusLabel1.Text
    5. If Me.CheckBox1.Checked Then
    6. dirOption = IO.SearchOption.AllDirectories
    7. End If
    8. Me.ListBox1.Items.Clear()
    9. If Me.ToolStripTextBox1.Text = "" And Me.ToolStripTextBox1.Enabled = True Then
    10. MsgBox("Kein Suchbegriff eingegeben!", MsgBoxStyle.Critical, "Achtung")
    11. ElseIf Me.ToolStripTextBox1.Enabled = False Then
    12. MsgBox("Zuerst einen Suchpfad auswählen", MsgBoxStyle.Critical, "Achtung")
    13. Else
    14. For Each fi In New System.IO.DirectoryInfo(op).GetFiles("*.*", dirOption)
    15. Me.ListBox1.Items.Add(fi)
    16. Label1.Text = "Anzahl Files: " & ListBox1.Items.Count.ToString
    17. Next
    18. If ListBox1.Items.Count < 1 Then
    19. MsgBox("Es wurde nichts gefunden", MsgBoxStyle.Information, "Meldung")
    20. End If
    21. End If
    22. End Sub
    23. Private Function D() As String
    24. Throw New NotImplementedException
    25. End Function
    26. End Class

    Aber nun funktioniert der Aufruf der Datein in der Listboc nicht mehr, da der Pfad nicht komplett ist

    VB.NET-Quellcode

    1. Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
    2. Dim Pfad As String
    3. Dim fi As String
    4. Pfad = ToolStripStatusLabel1.Text & ?????
    5. If Pfad = "" Then
    6. MsgBox("Keine Datei zum Öffnen vorhanden.", MsgBoxStyle.Information)
    7. Else
    8. MessageBox.Show(Pfad)
    9. End If
    10. End Sub


    Wie bekomme ich denn nun den kompletten Pfad von SelectedItem ?? Damit ich die Datei mit Process.start ausführen kann??

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