Domanda

Io sono un requisito per la ricerca di file in un determinato luogo per un determinato contenuto.Questi file potranno essere ricercati tramite web-application (che potrebbe non essere necessariamente sullo stesso server), e dovrebbe aggiornare in prossimità tempo reale.

Dopo aver cercato in giro per gli strumenti di Scansione/codice, ho colpito su questo risposta che indica che è possibile a livello di programmazione agganciare il costruito nel funzionalità di Ricerca di Windows di windows.

Utilizzando il codice riportato di seguito (più o meno le risposte di codice con un paio di modifiche minore), sono stato in grado di fare questo lavoro sulla mia macchina:

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

Ho diverse domande per quanto riguarda questo:

  1. C'è un meglio (cioèdi più .Net) modo di accedere la Ricerca di Windows, oltre a utilizzare una stringa di query?
  2. C'è un modo per parameterise il testo?Ho provato dritto aggiunta di OleDbParameters al comando, ma a quanto pare il CollatorDSO non lo supporta.Ovviamente, io preferirei non avere per igienizzare i dati in anticipo - come SQL injection, è probabile che mi mancheranno alcuni potenziali viale che sarà causare problemi

    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. Questo può essere letta da un computer remoto?

  4. Questo lavoro, anche se il server non hanno il software installato - cioèse la directory che contiene un file di excel, è indice anche se il server non è installato office?
È stato utile?

Soluzione

per la 3) ,4) msdn Utilizzo di SQL e AQS Approcci di interrogare l'Indice 1) si può provare ad aggiungere la funzione di windows tramite l'importazione non sicuri.2) guarda strano e vecchio stile, ma suppongo che non c'è altra opzione per questo tipo di approccio

Altri suggerimenti

Si può andare vecchia scuola e utilizzare FindStr in un Processo/ProcessStartInfo.

Findstr (uno strumento a riga di comando) è costruito nel vostro server ed è in grado di accedere a qualsiasi posizione a cui l'utente che sono la rappresentazione ha accesso.

Ho provato questo in una piccola singola pagina di attuazione e sono stato in grado di leggere/ scansione dei file sul mio disco locale così come i percorsi UNC.

Questo potrebbe essere un'opzione per voi.L'output è il testo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top