Как использовать службу поиска Windows в C#
Я работаю над приложением, пользователь может искать файлы или папки на локальном компьютере или в сети. Я использую DirectoryInfo.GetDirecotories ().
(а) Но я также хочу добавить функциональность, которую Windows 7 использует для поиска, я полагаю, что она использует индексацию. Я также видел "Службу поиска Windows" на MSDN, но я не уверен, какой путь лучше всего, запрашивая индексированный каталог или используя службу поиска, какие-либо предложения? (б) Мне было интересно, если кто-нибудь может дать мне небольшой пример на C#, который ищет в проиндексированном каталоге.
Заранее спасибо.
1 ответ
Смотрите пример ниже:
static void Main(string[] args)
{
var connection = new OleDbConnection(@"Provider=Search.CollatorDSO;Extended Properties=""Application=Windows""");
// File name search (case insensitive), also searches sub directories
var query1 = @"SELECT System.ItemName FROM SystemIndex " +
@"WHERE scope ='file:C:/' AND System.ItemName LIKE '%Test%'";
// File name search (case insensitive), does not search sub directories
var query2 = @"SELECT System.ItemName FROM SystemIndex " +
@"WHERE directory = 'file:C:/' AND System.ItemName LIKE '%Test%' ";
// Folder name search (case insensitive)
var query3 = @"SELECT System.ItemName FROM SystemIndex " +
@"WHERE scope = 'file:C:/' AND System.ItemType = 'Directory' AND System.Itemname LIKE '%Test%' ";
// Folder name search (case insensitive), does not search sub directories
var query4 = @"SELECT System.ItemName FROM SystemIndex " +
@"WHERE directory = 'file:C:/' AND System.ItemType = 'Directory' AND System.Itemname LIKE '%Test%' ";
connection.Open();
var command = new OleDbCommand(query4, connection);
using (var r = command.ExecuteReader())
{
while (r.Read())
{
Console.WriteLine(r[0]);
}
}
connection.Close();
Console.ReadKey();
}
Он использует API-интерфейс OLE DB для подключения к службе индексатора и использует синтаксис, подобный SQL, для поиска System
объекты в его SystemIndex
Таблица. У вас есть 4 примера запросов, которые делают разные вещи. Все примеры запросов будут искать в c:\
папка для элементов, которые содержат Test
в их именах.
Вы можете искать файлы, папки почты и, возможно, другие носители (в зависимости от ОС) на локальных или других компьютерах. Из того, что я исследовал, сетевые диски не поддерживаются, так как они не могут быть проиндексированы, но вы можете подключиться к другим машинам, для которых я предполагаю, что RPC используется в фоновом режиме, что означает, что вы должны предоставлять сетевые учетные данные, используя другой API (например, System. Сеть).
Обратите внимание, что для того, чтобы все это работало, ваша индексация должна быть полностью работоспособна на целевой машине (что по умолчанию). API соответствует тому, что вы указываете в опциях индексирования. Это экран в вопросе:
Полный список свойств для System
Объект можно найти здесь: Ссылка на систему свойств. Этот объект содержит такие вещи, как URL, путь, имя, дата и т. Д.
Более интересные примеры с использованием разных предикатов (например, scope
а также directory
) можно найти здесь: Синтаксис поиска в Windows Vista. Существует также грубая документация MSDN: предикаты SCOPE и DIRECTORY
Я рекомендую вам ознакомиться с документацией, потому что вы можете сделать много вещей с этим API.