Um die Windows-Suche über die WinRT-Library verwenden zu können, ist zunächst eine Referenz auf eben jene notwendig. In einer Windows-Store Anwendung ist dies das geringere Problem, in WPF- und WinForms-Anwendungen hingegen sieht dies schon wieder anders aus. Denn bei Letzteren steht diese Assembly – selbst bei der Verwendung des neuesten Studios auf Windows 8 – nicht in der Liste der zur Verfügung stehenden Assemblys. Aber wie kann man es auch anders erwarten. Natürlich gibt es auch hierfür wieder einen Trick.
Um die WinRT-Library auch in diesen Anwendungen nutzen zu können, müssen lediglich folgende Schritte durchgeführt werden:
- Visual Studio nach Anlegen des Projektes schließen.
- Die jeweilige *.csproj-Datei im Editor bearbeiten.
- Das Tag „TargetPlatformVersion“ suchen und hier den Wert „8.0“ bzw. ab Windows Blue auch „8.1“ einfügen.
- Die Änderung speichern und das Projekt wieder im Studio öffnen.
Nun ist es möglich, die WinRT-Library wie normale .NET-Assemblys zu referenzieren. Allerdings sollte man sich darüber im Klaren sein, dass die resultierende Anwendung auch nur für die entsprechenden Systeme ausgelegt ist und somit nicht mehr unter Windows 7 oder älteren Windowsversionen funktioniert.
Im nächsten Schritt können wir nun eine Methode implementieren, welche uns die Windows-Suche zur Verfügung stellt. Da wir nun ohnehin an Win8+ gebunden sind, kann und sollte nun auch .NET 4.5 verwendet werden. Um die Windows-Suche verwenden zu können, sind zunächst folgende Using-Directives notwendig:
using Windows.Storage; using Windows.Storage.Search;
Anschließend können wir unsere Methode in einer Klasse nach Wahl implementieren (der Modifier sollte nicht vergessen werden, den habe ich hier im Beispiel außen vor gelassen):
async Task<IReadOnlyList<StorageFile>> SearchAsync(string filter, string folder = "C:\\") { var documents = KnownFolders.DocumentsLibary; var queryOptions = new QueryOptions { FolderDepth = FolderDepth.Deep, IndexerOption.UseIndexerWhenAvailable, UserSearchFilter = string.Format("'{0}' folder:{1}", filter, folder) }; var query = documents.CreateFileQueryWithOptions(queryOptions); return await query.GetFilesAsync(); }
Und schon können wir über diese Methode die Windows-Suche verwenden. Wahlweise könnte das ganze natürlich auch synchron verwendet und implementiert werden.