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();
        }
    }
}

У меня есть несколько вопросов по этому поводу:

  1. Есть ли лучший (т.е. более.Net) способ доступа к Windows Search, помимо использования строковых запросов?
  2. Есть ли способ параметризации текста? Я пытался прямо добавить 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();
    
  3. Можно ли получить доступ с удаленного компьютера?

  4. Будет ли это работать, даже если на сервере не установлено соответствующее программное обеспечение - то есть, если в каталоге содержится файл Excel, будет ли он индексироваться, даже если на сервере не установлен офис?

2 ответа

Решение

Для 3), 4) msdn Используя SQL и AQS подходы для запроса индекса для 1), вы можете попробовать добавить функцию Windows через импорт небезопасно. 2) выглядит странно старомодно, но я полагаю, что нет другого варианта для этого подхода

Вы можете перейти к старой школе и использовать FindStr в Process / ProcessStartInfo.

Findstr (инструмент командной строки) встроен в ваш сервер и может получить доступ к любому местоположению, к которому имеет доступ пользователь, подражающий вам.

Я попробовал это в небольшой одностраничной реализации, и я смог читать / сканировать файлы на локальном диске, а также пути UNC.

Это может быть вариантом для вас. Вывод текстовый.

Другие вопросы по тегам