Windows Search - есть ли лучший способ?
У меня есть требование для поиска файла в указанном месте для указанного содержимого. Эти файлы будут искать через веб-приложение (которое может не обязательно находиться на одном сервере) и должны обновляться в режиме реального времени.
Посмотрев вокруг на наличие инструментов / кода для сканирования, я наткнулся на этот ответ, который показал, что вы можете программно подключиться к встроенной функции поиска Windows в Windows.
Используя приведенный ниже код (более или менее код ответов с несколькими незначительными изменениями), я смог успешно выполнить эту работу на своем компьютере:
public class WindowsSearchScanner
{
private const string Query = @"SELECT System.ItemName FROM SystemIndex WHERE scope ='file:{0}' and FREETEXT('{1}')";
public void DoSearch(string criteria, string path)
{
string connectionString = "Provider=Search.CollatorDSO;Extended Properties=\"Application=Windows\"";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
string query = string.Format(Query, path, criteria);
OleDbCommand command = new OleDbCommand(query, connection);
connection.Open();
List<string> result = new List<string>();
OleDbDataReader reader = command.ExecuteReader();
int count = 0;
while (reader.Read())
{
result.Add(reader.GetString(0));
Console.WriteLine(reader.GetString(0));
count++;
}
Console.WriteLine(count + " Records Found");
connection.Close();
}
}
}
У меня есть несколько вопросов по этому поводу:
- Есть ли лучший (т.е. более.Net) способ доступа к Windows Search, помимо использования строковых запросов?
Есть ли способ параметризации текста? Я пытался прямо добавить
OleDbParameters
к команде, но, очевидно, CollatorDSO не поддерживает его. Очевидно, что я предпочел бы не проводить предварительную очистку данных - например, SQL-инъекция, скорее всего, я упущу какой-то потенциальный путь, который вызовет проблемыstring query = @"SELECT System.ItemName FROM SystemIndex WHERE scope ='file:' + @path and FREETEXT(@text)"; OleDbCommand command = new OleDbCommand(query, connection); command.Parameters.Add(new OleDbParameter("path", path)); command.Parameters.Add(new OleDbParameter("text", criteria)); connection.Open();
Можно ли получить доступ с удаленного компьютера?
- Будет ли это работать, даже если на сервере не установлено соответствующее программное обеспечение - то есть, если в каталоге содержится файл Excel, будет ли он индексироваться, даже если на сервере не установлен офис?
2 ответа
Для 3), 4) msdn Используя SQL и AQS подходы для запроса индекса для 1), вы можете попробовать добавить функцию Windows через импорт небезопасно. 2) выглядит странно старомодно, но я полагаю, что нет другого варианта для этого подхода
Вы можете перейти к старой школе и использовать FindStr в Process / ProcessStartInfo.
Findstr (инструмент командной строки) встроен в ваш сервер и может получить доступ к любому местоположению, к которому имеет доступ пользователь, подражающий вам.
Я попробовал это в небольшой одностраничной реализации, и я смог читать / сканировать файлы на локальном диске, а также пути UNC.
Это может быть вариантом для вас. Вывод текстовый.