La Ricerca di Windows - c'È un modo migliore?
-
20-12-2019 - |
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:
- C'è un meglio (cioèdi più .Net) modo di accedere la Ricerca di Windows, oltre a utilizzare una stringa di query?
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 problemistring 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();
Questo può essere letta da un computer remoto?
- 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?
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.