Question

J'ai besoin de rechercher un fichier dans un emplacement donné pour un contenu spécifié. Ces fichiers seront recherchés via une application Web (qui peut ne pas nécessairement être sur le même serveur) et doit mettre à jour près de temps réel.

Après avoir regardé autour de vous pour les outils / code de numérisation, je frappe sur Cette répond à laquelle vous avez indiqué que vous pouvez accrocher par programmation dans le Caractéristique de recherche de Windows intégrée de Windows.

Utilisation du code ci-dessous (plus ou moins le code de réponse avec quelques modifications mineures), j'ai pu effectuer avec succès ce travail sur ma machine:

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

J'ai plusieurs requêtes concernant ceci:

  1. Y a-t-il un meilleur (c'est-à-dire plus .NET) d'accéder à la recherche Windows, au-delà de l'utilisation de requêtes de chaîne?
  2. Y a-t-il un moyen de paramétrer le texte? J'ai essayé tout droit ajoutant OleDbParameters à la commande, mais apparemment, la Collatordso ne le supporte pas. De toute évidence, je préférerais ne pas avoir à désinfecter les données à l'avance - comme l'injection SQL, elle va probablement manquer une avenue potentielle qui causera des problèmes

    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. peut-il être accédé à partir d'une machine distante?

  4. Cela fonctionnera-t-il même si le serveur n'a pas le logiciel correspondant installé - c'est-à-dire que le répertoire contient un fichier Excel, indiquera-t-il même si le serveur n'a pas de bureau installé?
Était-ce utile?

La solution

pour 3), 4) MSDN utilisant des approches SQL et AQS pour interroger l'index Pour 1) Vous pouvez essayer d'ajouter une fonction Windows via Importer un danger. pour 2) a l'air bizarre à l'ancienne mais je suppose qu'il n'y a pas d'autre option pour cette approche

Autres conseils

Vous pouvez aller de l'ancienne école et utiliser FindStr dans un processus / processstartinfo.

Findstr (un outil de ligne de commande) est intégré à votre serveur et est capable d'accéder à n'importe quel emplacement auquel l'utilisateur que vous utilisez a accès.

J'ai essayé cela dans une petite mise en œuvre d'une seule page et j'ai pu lire / numériser des fichiers sur mon lecteur local ainsi que des chemins UNC.

Cela pourrait être une option pour vous.La sortie est du texte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top