Вопрос

У меня есть требование выполнить поиск файла в заданном местоположении по указанному содержимому.Поиск по этим файлам будет осуществляться с помощью веб-приложения (которое не обязательно может находиться на том же сервере) и должно обновляться практически в режиме реального времени.

Осмотревшись в поисках инструментов сканирования / кода, я наткнулся на этот ответ, в котором указывалось, что вы можете программно подключиться к встроенной в 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, помимо использования строковых запросов?
  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, будет ли он индексироваться, даже если на сервере не установлен office?
Это было полезно?

Решение

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

Другие советы

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

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

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

Это может быть подходящим вариантом для вас.На выходе получается текст.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top