String Array mit Dateinamen incl Pfad in Explorer Fenster anzeigen

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    String Array mit Dateinamen incl Pfad in Explorer Fenster anzeigen

    Hallo Leute,

    mein kleines Projekt neigt sich langsam dem Ende, allerdings habe ich noch eine Hürde zu nehmen, bei der ich nochmal eure Unterstützung bräuchte.

    Folgendes, Ich habe inzwischen eine Möglichkeit gefunden den Windows Indexdienst zu nutzen um bestimmte Schlüsselworte in Dateien zu suchen. Als Ergebnis aus dieser Aktion erhalte ich ein Array mit DateiPfad + Dateiname als String. Im Moment lasse ich mir das Array als Liste anzeigen und verpasse den Einträgen einen Link zur Datei. Allerdings würde ich gerne den Komfort des Windows Explorer nutzen. z.B. die Dateivorschau oder das Sortieren nach Datum letzter Änderung/Dateigröße/Dateiname/usw.

    Da ich nur ungern diese Funktion nachbauen möchte, stellt sich natürlich die Frage, kann ich dem Explorer eine Liste von Dateien übergeben, die er dann ähnlich dem suchen Fenster, anzeigt?

    Hier der Code, der mir die Dateien findet

    VB.NET-Quellcode

    1. ​Private Sub BtnCatSearch_Click(sender As Object, e As EventArgs) Handles BtnCatSearch.Click
    2. Dim iZaehler As Integer = 0
    3. Dim connection = New OleDbConnection("Provider=Search.CollatorDSO;Extended Properties=""Application=Windows""")
    4. connection.Open()
    5. Dim query = "SELECT System.ItemPathDisplay FROM SystemIndex WHERE SCOPE ='file:" & MyCatalog & "\' AND CONTAINS('%" & sBasis & "%')"
    6. Dim command = New OleDbCommand(query, connection)
    7. Try
    8. Using reader As OleDbDataReader = command.ExecuteReader()
    9. If reader.HasRows Then
    10. While reader.Read()
    11. Dateiliste(iZaehler) = reader(0).ToString
    12. iZaehler = +1
    13. End While
    14. Else
    15. MsgBox(sBasis & " nicht gefunden!", vbOKOnly)
    16. End If
    17. End Using
    18. Catch ex As Exception
    19. Console.WriteLine("Unbekannter Befehl!")
    20. End Try
    21. connection.Close()
    22. ReDim Preserve Dateiliste(iZaehler)
    23. For i = 0 To iZaehler - 1
    24. Debug.Print(Dateiliste(i))
    25. Next
    26. If iZaehler > 0 Then Searchresult.ShowDialog()
    27. End Sub


    Gesucht wird nach dem Wort in der Variable "sBasis"
    Die Liste der Dateien , die den Suchbegriff beinhalten, werden in Stringform in dem Array "Dateiliste()" gespeichert.

    Hat dazu jemand Erfahrungswerte? Oder zumindest einen Ansatz?

    Grüße Darkscale

    PS: Wenn mir jemand noch einen generellen Tipp zu meinem Code geben möchte, der ihn kürzer/eleganter macht, dann immer raus damit. :D
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    Eine Antwort, wie man den Explorer fernsteuert, weiss ich leider nicht.

    Darkscale schrieb:

    generellen Tipp zu meinem Code
    Wie findste so?

    VB.NET-Quellcode

    1. Private Function WindowIndexSearch(directory As String, contentPattern As String) As List(Of String)
    2. Dim query = $"SELECT System.ItemPathDisplay FROM SystemIndex WHERE SCOPE ='file:{directory}\' AND CONTAINS('%{contentPattern}%')"
    3. Dim sCon = "Provider=Search.CollatorDSO;Extended Properties=""Application=Windows"""
    4. Using connection = New OleDbConnection(sCon), command = New OleDbCommand(query, connection)
    5. connection.Open()
    6. Using reader = command.ExecuteReader()
    7. Dim lst = New List(Of String)
    8. While reader.Read()
    9. lst.Add(reader(0).ToString)
    10. End While
    11. Return lst
    12. End Using
    13. End Using
    14. End Function
    Das ist eine in sich geschlossene Methode, wo alle Randbedingungen in der ersten Zeile gegeben sind. Das macht den Code sehr verständlich und auch portabel - du kannst ihn auskopieren, und er läuft bei dir (was man von deim Code bei mir nicht sagen konnte).
    Alle disposablen Objekte werden mit Using behandelt. Wenn Using dir nicht bekannt ist, recherchiere das - ist wichtig.
    Statt mit Array rumzuhampeln nutze ich einfach List(Of String)
    Reader.HasRows abzufragen kann man sich sparen - wenner keine Rows has, dann geht er nicht in die Schleife und gut (returnt wird dann eben eine leere Liste, was ja die korrekte Antwort ist).
    Deinen TryCatch habich natürlich rausgeworfen, schon weil die Fehlermeldung irreführender nicht sein kann - falls da mal ein Fehler auftritt.
    Siehe unbedingt TryCatch ist ein heißes Eisen
    Also wenn da ein Fehler auftritt, und wenn die Anwendung weiterlaufen soll und kann, und du willst den Fehler nur inne Console ausgeben (sieht das der User ühaupt?), dann sollteste ihn dort auch ausgeben, und nicht einen selbsterfundenen Text, der womöglich nix mit dem Fehler zu tun hat.
    Auch zu überlegen, ob ausgeben, wo genau der Fehler auftrat.



    Ah - zu deine eigliche Frage fällt mir nu doch noch ein: Man kann im Explorer eine Suche ja auch speichern - dabei entsteht eine Datei, durch die bei Doppelklick die Suche erneut ausgeführt wird.
    Per Code kann man so eine Datei (ist Xml-Code) auch generieren, und mit Process.Start() ausführen, dann sollte sich ein Explorer öffnen, und die Suche ausführen.



    Ach hier noch ein:

    VB.NET-Quellcode

    1. Private Shared Function WindowIndexSearch(directory As String, contentPattern As String) As List(Of String)
    2. Dim commandText = $"SELECT System.ItemPathDisplay FROM SystemIndex WHERE SCOPE ='file:{directory}\' AND CONTAINS('%{contentPattern}%')"
    3. Dim sCon = "Provider=Search.CollatorDSO;Extended Properties=""Application=Windows"""
    4. Using adp = New OleDbDataAdapter(commandText, sCon), tb = New DataTable
    5. adp.Fill(tb)
    6. Dim lst = tb.Rows.Cast(Of DataRow).Select(Function(rw) rw(0).ToString).ToList
    7. Return lst
    8. End Using
    9. End Function
    DataReader sind doch wirklich umständliche Grütze.

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