Lösungsansätze Windows 10 Indizierungsdienst abfragen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Darkscale.

    Lösungsansätze Windows 10 Indizierungsdienst abfragen

    Hallo VB-Paradiese,
    frohes neues Jahr euch allen.
    Ich starte nun auch mit frischem Elan in das neue Jahr und bin gerade an einer Aufgabenstellung, für die ich noch nicht so recht einen Ansatz habe. Ich hoffe, dass ihr mir evtl einen Hinweis geben könnt wie ich das Thema sinnvoll angehen kann.

    Aufgabe:
    Ich möchte in einem Ordner meiner Wahl (incl. Unterverzeichnisse), innerhalb der dort abgelegten Dokumente (pdf, xlsx, docx, usw.), und der Dateinamen nach Schlagworten suchen. Windows bringt diese Fähigkeit mit dem Indizierungsdienst bereits mit, aber wie kann man diesen Ansprechen?

    Die gewünschte Ausgabe ist ein Windows Explorerfenster mit den Entsprechenden Dateien incl. dem Verzeichnis in dem diese abgelegt sind.

    Fragen:
    Kann ich mittels VB.net direkt auf diesen Indexdienst zugreifen?
    Falls dies nicht möglich ist, kann ich ein Explorerfenster "fernsteuern"? (Fenster mit Verzeichnis aufrufen und dann per Suche nach dem Schlüsselwort suchen)

    Zur Anzeige der Ergebnisse:
    Muss ich hier mein "eigenes" Ausgabefenster nachprogrammieren oder kann ich einen Standard Ordner dafür nutzen?

    Detaillierte Beschreibung
    Spoiler anzeigen
    Ich programmiere eine Art Lauchbar die mehrere Suchfunktionen vereinen soll. Dort wird dann in einer Textbox ein Suchbegriff eingegeben. Die Launchbar bietet dann mehrere Buttons an, wo nach diesem Begriff gesucht werden soll. Dies beinhaltet Diverse Websites, Datenbanken und auch Lokalen Dateien. In einer Vorgängerversion in VBScript habe ich die oben gesuchte Funktion durch ein Eingabescript von Tastatuskommandos realisiert. Da diese Vorgehensweise allerdings sehr Fehlerbehaftet ist und ich das Projekt sowieso auf vb.net portieren wollte, gilt es nun eine elegantere Lösung zu finden.


    Vielen Dank
    Grüße Darkscale

    PS: Ich suche noch nicht nach konkretem Code. Da ich noch lerne, möchte ich mich entsprechend einlesen, weiß aber noch nicht so genau wie ich das angehen soll.

    *Verschoben da keinerlei Hinweis das es hier um WPF geht* ~NoFear23m
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!

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

    @EaranMaleasi
    Danke für den Tipp. Auf den ersten Blick sieht es vielversprechend aus. Ich werde mich mal reinfuchsen.

    Grüße,
    Darkscale
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    Hi.

    Vielleicht hilft dieses hier:

    docs.microsoft.com/de-de/windo…ch/-search-sample-dsearch

    Leider nur in Englisch.
    Es sollte bei schon "Indexierten" Dateien die Möglichkeit bieten, resultate auszuwerten.

    Da bekanntlich der "normalzustand" des Indexierungsdienstes ist, den "gesamten Suchumfang als Index" vorzuhalten, ist auch nur das "Indexierte" zu Filtern und zu durchsuchen.

    c.u. Joshi aus HaHa-Land, oder eher LaLa-Land ?
    Hallo Leute,
    ich habe jetzt etwas Zeit gefunden mich mit der Aufgabe zu beschäftigen. Leider stecke ich ein bisschen in der Sackgasse. Aktuell drängen sich mir zwei Fragen auf, die ich, da ich mit Datenbanken noch nicht gearbeitet haben, nicht beantwortet bekomme.

    VB.NET-Quellcode

    1. ​Private Sub BtnCatSearch_Click(sender As Object, e As EventArgs) Handles BtnCatSearch.Click
    2. Dim connection = New OleDbConnection("Provider=Search.CollatorDSO;Extended Properties=""Application=Windows""")
    3. Dim query1 = "SELECT System.ItemName FROM SystemIndex " & "WHERE scope ='file:C:/Testfolder/' AND System.ItemName LIKE '%Suchmich%'"
    4. 'Dim query2 = "SELECT System.ItemName FROM SystemIndex " & "WHERE directory = 'file:C:/' AND System.ItemName LIKE '%Test%' "
    5. 'Dim query3 = "SELECT System.ItemName FROM SystemIndex " & "WHERE scope = 'file:C:/' AND System.ItemType = 'Directory' AND System.Itemname LIKE '%Test%' "
    6. 'Dim query4 = "SELECT System.ItemName FROM SystemIndex " & "WHERE directory = 'file:C:/' AND System.ItemType = 'Directory' AND System.Itemname LIKE '%Test%' "
    7. connection.Open()
    8. Dim command = New OleDbCommand(query1, connection)
    9. Using r = command.ExecuteReader()
    10. While r.Read()
    11. 'Debug.WriteLine(r(0))
    12. Console.WriteLine(r(0))
    13. End While
    14. End Using
    15. connection.Close()
    16. Console.ReadKey()
    17. End Sub 'TODO


    Wenn ich den Code ausführe, bekomme ich eine Fehlermeldung:

    Quellcode

    1. ​Ausnahme ausgelöst: "System.InvalidOperationException" in mscorlib.dll
    2. System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unbehandelte Ausnahme</Description><AppDomain>Workbench.exe</AppDomain><Exception><ExceptionType>System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Schlüssel können nicht gelesen werden, wenn keine der Anwendungen eine Konsole besitzt, oder wenn die Konsoleneingabe aus einer Datei umgeleitet wurde. Verwenden Sie Console.Read.</Message><StackTrace> bei System.Console.ReadKey(Boolean intercept)
    3. bei System.Console.ReadKey()
    4. bei Workbench.Main.BtnCatSearch_Click(Object sender, EventArgs e) in A:\Workbench VB.NET\Workbench\Main.vb:Zeile 259.
    5. bei System.Windows.Forms.Control.OnClick(EventArgs e)
    6. bei System.Windows.Forms.Button.OnClick(EventArgs e)
    7. bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    8. bei System.Windows.Forms.Control.WmMouseUp(Message&amp;amp; m, MouseButtons button, Int32 clicks)
    9. bei System.Windows.Forms.Control.WndProc(Message&amp;amp; m)
    10. bei System.Windows.Forms.ButtonBase.WndProc(Message&amp;amp; m)
    11. bei System.Windows.Forms.Button.WndProc(Message&amp;amp; m)
    12. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
    13. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
    14. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    15. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp;amp; msg)
    16. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    17. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    18. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    19. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    20. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    21. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    22. bei Workbench.My.MyApplication.Main(String[] Args) in :Zeile 81.</StackTrace><ExceptionString>System.InvalidOperationException: Schlüssel können nicht gelesen werden, wenn keine der Anwendungen eine Konsole besitzt, oder wenn die Konsoleneingabe aus einer Datei umgeleitet wurde. Verwenden Sie Console.Read.
    23. bei System.Console.ReadKey(Boolean intercept)
    24. bei System.Console.ReadKey()
    25. bei Workbench.Main.BtnCatSearch_Click(Object sender, EventArgs e) in A:\Workbench VB.NET\Workbench\Main.vb:Zeile 259.
    26. bei System.Windows.Forms.Control.OnClick(EventArgs e)
    27. bei System.Windows.Forms.Button.OnClick(EventArgs e)
    28. bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    29. bei System.Windows.Forms.Control.WmMouseUp(Message&amp;amp; m, MouseButtons button, Int32 clicks)
    30. bei System.Windows.Forms.Control.WndProc(Message&amp;amp; m)
    31. bei System.Windows.Forms.ButtonBase.WndProc(Message&amp;amp; m)
    32. bei System.Windows.Forms.Button.WndProc(Message&amp;amp; m)
    33. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
    34. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
    35. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    36. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp;amp; msg)
    37. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    38. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    39. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    40. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    41. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    42. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    43. bei Workbench.My.MyApplication.Main(String[] Args) in :Zeile 81.</ExceptionString></Exception></TraceRecord>
    44. Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in mscorlib.dll aufgetreten.
    45. Schlüssel können nicht gelesen werden, wenn keine der Anwendungen eine Konsole besitzt, oder wenn die Konsoleneingabe aus einer Datei umgeleitet wurde. Verwenden Sie Console.Read.


    Wenn ich diese richtig verstehe, dann bockt das Programm, weil ich auf meiner Windows Form keine Console laufen habe.
    Ich möchte die Suchergebnisse allerdings nicht in eine Console ausgeben, sondern als Explorerfenster mit den gefundenen Dateien, in denen der Suchbegriff "Findemich" auftaucht. Oder zumindest die Dateien in einem Array speichern.

    Leider kann ich keine Fehlersuche betreiben, da ich mit den Parametern der OleDbConnection nichts anfangen kann. Ich weiß ja leider nicht mal, wie die Ausgabe eines eventuellen Treffers erfolgt.
    Ich bin bei der suche nach Datenbankabfragen auf die API ADO gestoßen activevb.de/tutorials/tut_vbnetado/vbnetado.html
    Aber auch da komme ich leider nicht weiter.

    ?(

    Grüße,
    Darkscale
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    Hi.

    Bei Docs.MS.com reden die von Pfeifen... Hmmm Ahhh Pipe ist eine Datenumleitung. ;)

    VB.NET-Quellcode

    1. While r.Read()
    2. 'Debug.WriteLine(r(0))
    3. Console.WriteLine(r(0))
    4. End While

    VB.NET-Quellcode

    1. Dim tempString as String = ""
    2. While r.read()
    3. tempstring &= r.first
    4. End While
    5. Console.Write(tempString)


    Damit kommt keine Ausgabe?

    Ich würde das ersteinmal so herrum versuchen.
    Ansonsten mal mit der Pipe der Konsole rumspielen.

    Infos habe ich hier leider nur in C# gefunden.

    Das zum Thema aus der Hüfte geschossen... Kannst es aber auch andersherrum machen lol

    Hoffentlich hilf das.

    c.u. Joshi
    Hallo Leute,
    ich bin nun etwas weiter gekommen. Und habe den Code etwas Modifiziert. Danke euch erstmal.

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Private Sub BtnCatSearch_Click(sender As Object, e As EventArgs) Handles BtnCatSearch.Click
    3. Dim Suchbegriff As String = "Test"
    4. Dim connection = New OleDbConnection("Provider=Search.CollatorDSO;Extended Properties=""Application=Windows""")
    5. connection.Open()
    6. Dim query = "SELECT System.ItemPathDisplay FROM SystemIndex " & "WHERE scope ='file:C:\Testfolder\' AND System.ItemName LIKE '%" & Suchbegriff & "%'"
    7. Dim command = New OleDbCommand(query, connection)
    8. Try 'Übergangsweise eingesetzt...
    9. Using reader As OleDbDataReader = command.ExecuteReader()
    10. If reader.HasRows Then
    11. While reader.Read()
    12. Console.WriteLine(reader(0))
    13. End While
    14. Else
    15. Console.WriteLine("Kein Input!")
    16. End If
    17. End Using
    18. Catch ex As Exception
    19. Console.WriteLine(Suchbegriff & " nicht gefunden!")
    20. End Try
    21. connection.Close()
    22. End Sub 'TODO


    Nun findet er mit diesem Code schon mal die entsprechenden Dateien und ich kann mir den kompletten Dateipfad als String anzeigen lassen. Soweit so gut.

    C:\Testfolder\Testdatei.txt
    C:\Testfolder\Unterordner\Testdatei im Unterordner.txt

    Bleibt noch eine Frage Ich möchte nicht nur nach den Dateinamen suchen, sondern auch innerhalb der Dateien.
    In den Textdateien ist jeweils "Findemich" geschrieben.

    Die suche im Explorer findet diesen Eintrag, nachdem in den Erweiterten Optionen "Dateiinhalte" aktiviert wurde.
    Kann mir jemand sagen, wie der OleDbCommand aussehen muss, damit auch innerhalb der Dateien gesucht wird?
    LIKE fällt offensichtlich raus
    CONTAINS ebenfalls nicht.

    Gibt es eine Liste der möglichen OleDbCommands für den Search.CollatorDSO bzw. SEARCHINDEX?

    Grüße,
    Darkscale

    UPDATE:Ich habe den Befehl nun gefunden! Und teile natürlich!
    Der Schlüssel ist FREETEXT(Contains, xxx)

    VB.NET-Quellcode

    1. Dim query = "SELECT System.ItemPathDisplay FROM SystemIndex " & "WHERE scope ='file:C:\Testfolder\' AND FREETEXT(Contents, '" & Suchbegriff & "')"


    UPDATE2: OK, habe es doch nicht gefunden! :/ Ist schon spät... :sleeping:
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!

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

    Moin.

    Ja hier ist´s früh. Kaffee lüaft, ähh läuft...

    Tanke, also Reihenprüfung zuerst. "Nein Schatz, nicht Reifeprüfung..."


    Ist der Indexdienst auch so eingestellt, das dieser auch die Inhalte Indexiert?

    Vielleicht deshalb keine Resultate.

    Aber über Freetext bin ich auch gestolpert.

    c.u. Joshi der Kaffeetrinkende
    Hallo Leute,
    ich habe nun eine funktionierende Abfrage gefunden. Man sollte auch sicherstellen, dass der gesuchte Begriff auch tatsächlich in der Datei enthalten ist. :whistling:

    Hier also der funktionierende Code. Dieser listet in der Console die Dateien mit Pfad auf, in denen der Suchbegriff gefunden wurde:

    VB.NET-Quellcode

    1. Private Sub BtnCatSearch_Click(sender As Object, e As EventArgs) Handles BtnCatSearch.Click
    2. Dim Suchbegriff As String = "Findemich"
    3. Dim connection = New OleDbConnection("Provider=Search.CollatorDSO;Extended Properties=""Application=Windows""")
    4. connection.Open()
    5. Dim query = "SELECT System.ItemName,System.ItemUrl FROM SystemIndex WHERE SCOPE ='file:C:/Testfolder/' AND CONTAINS('%" & Suchbegriff & "%')"
    6. Dim command = New OleDbCommand(query, connection)
    7. Try
    8. Using reader As OleDbDataReader = command.ExecuteReader()
    9. If reader.HasRows Then
    10. Console.WriteLine(Suchbegriff & " wird gesucht!")
    11. While reader.Read()
    12. Console.WriteLine(reader(0))
    13. End While
    14. Else
    15. Console.WriteLine("Kein Daten gefunden!")
    16. End If
    17. End Using
    18. Catch ex As Exception
    19. Console.WriteLine("Unbekannter Befehl!")
    20. End Try
    21. connection.Close()
    22. End Sub


    Vielen Dank für die Ideen und Hilfestellungen. Ihr habt mir sehr geholfen.

    Grüße Darkscale
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!