Pergunta

Eu tenho um requisito para procurar o arquivo em um local determinado para o conteúdo especificado.Estes arquivos serão pesquisados através de uma aplicação web (que pode não ser necessariamente no mesmo servidor), e deve atualizados quase em tempo real.

Depois de olhar ao redor para as ferramentas de verificação de código, eu bati em cima este de respostas que indicaram que, programaticamente, você pode ligar para Windows, o recurso de Pesquisa do windows.

Usando o código abaixo (mais ou menos as respostas de código com alguns ajustes menores), eu tenho sido capaz de fazer esse trabalho em minha 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();
        }
    }
}

Eu tenho várias dúvidas relativas a esta:

  1. Há um melhor (i.é.mais .Net) maneira de acessar a Pesquisa do Windows, além da utilização de seqüência de caracteres de consulta?
  2. Existe uma maneira de parametrizar o texto?Eu tentei em linha reta até a adição de OleDbParameters para o comando, mas, aparentemente, a CollatorDSO não as suporta.Obviamente, eu prefiro não ter para higienizar os dados de antemão - como injeção de SQL, é provável que eu vou sentir falta de alguns potencial avenida que vai causar 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. Isso pode ser acessada a partir de um computador remoto?

  4. Será que isso funciona mesmo se o servidor não tiver o respectivo software instalado - i.e.se o diretório que contém um arquivo do excel, este índice, mesmo se o servidor não tem o office instalado?
Foi útil?

Solução

3) ,4) msdn Usando SQL e AQS Abordagens para Consultar o Índice para 1), você pode tentar adicionar função do windows por meio de importação inseguro.2) parece estranho à moda antiga, mas suponho que não há outra opção para esta abordagem

Outras dicas

Você pode ir old-school e utilize o comando FindStr em um Processo/ProcessStartInfo.

Findstr (uma ferramenta de linha de comando) está incorporada ao seu servidor e é capaz de acessar qualquer local para o qual o usuário está representando tenha acesso.

Eu tentei isso em uma pequena único-página implementação e eu era capaz de ler/ escanear arquivos no disco local, bem como os caminhos UNC.

Esta poderia ser uma opção para você.A saída é o texto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top