Pregunta

Tengo el requisito de buscar un archivo en una ubicación determinada para contenido específico.Estos archivos se buscarán a través de una aplicación web (que puede no estar necesariamente en el mismo servidor) y deberían actualizarse casi en tiempo real.

Después de buscar herramientas/códigos de escaneo, encontré este respuesta que indicó que puede conectarse mediante programación a la función de búsqueda de Windows incorporada de Windows.

Usando el siguiente código (más o menos el código de respuestas con algunos ajustes menores), pude hacer que esto funcione con éxito en mi máquina:

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

Tengo varias consultas al respecto:

  1. Hay una mejor (es decir.más .Net) de acceder a la Búsqueda de Windows, más allá del uso de consultas de cadenas?
  2. ¿Hay alguna manera de parametrizar el texto?Intenté agregar directamente OleDbParameters al comando, pero aparentemente CollatorDSO no lo admite.Obviamente, preferiría no tener que desinfectar los datos de antemano; como la inyección SQL, es probable que pierda alguna vía potencial que cause problemas.

    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. ¿Se puede acceder a esto desde una máquina remota?

  4. ¿Funcionará esto incluso si el servidor no tiene instalado el software correspondiente?Si el directorio contiene un archivo Excel, ¿se indexará incluso si el servidor no tiene Office instalado?
¿Fue útil?

Solución

para 3), 4) msdn Uso de enfoques SQL y AQS para consultar el índicepara 1) puede intentar agregar la función de Windows mediante importación no segura.para 2) parece extraño y pasado de moda, pero supongo que no hay otra opción para este enfoque

Otros consejos

Puede ir a la vieja escuela y usar FindStr en un Process/ProcessStartInfo.

Findstr (una herramienta de línea de comandos) está integrada en su servidor y puede acceder a cualquier ubicación a la que tenga acceso el usuario que se está haciendo pasar.

Probé esto en una pequeña implementación de una sola página y pude leer/escanear archivos en mi disco local, así como rutas UNC.

Esta podría ser una opción para ti.La salida es texto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top