سؤال

لدي شرط للبحث عن ملف في موقع معين لمحتوى محدد.سيتم البحث في هذه الملفات عبر تطبيق ويب (والذي قد لا يكون بالضرورة موجودًا على نفس الخادم)، ويجب تحديثه في الوقت الفعلي تقريبًا.

بعد البحث عن أدوات/رمز المسح الضوئي، قمت بالنقر عليه هذا الإجابة التي تشير إلى أنه يمكنك ربط برمجيًا بميزة Windows Search المضمنة في Windows.

باستخدام الكود أدناه (رمز الإجابات بشكل أو بآخر مع بعض التعديلات الطفيفة)، تمكنت من تنفيذ هذا العمل بنجاح على جهازي:

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

لدي عدة استفسارات بخصوص هذا:

  1. هل يوجد أحسن (أي.more.Net) للوصول إلى Windows Search، بخلاف استخدام استعلامات السلسلة؟
  2. هل هناك طريقة لتحديد معلمات النص؟لقد حاولت الإضافة مباشرة OleDbParameters إلى الأمر، ولكن يبدو أن CollatorDSO لا يدعمه.من الواضح أنني أفضل عدم الاضطرار إلى تنظيف البيانات مسبقًا - مثل حقن SQL، فمن المحتمل أن أفتقد بعض الطرق المحتملة التي قد تسبب مشاكل

    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. هل يمكن الوصول إلى هذا من جهاز بعيد؟

  4. هل سيعمل هذا حتى لو لم يكن الخادم مثبتًا عليه البرنامج ذو الصلة - على سبيل المثال.إذا كان الدليل يحتوي على ملف Excel، فهل سيتم فهرسته حتى لو لم يكن الخادم مثبتًا عليه Office؟
هل كانت مفيدة؟

المحلول

ل3) ،4) msdn باستخدام أساليب SQL وAQS للاستعلام عن الفهرسلـ 1) يمكنك محاولة إضافة وظيفة Windows عبر الاستيراد غير الآمن.لـ 2) يبدو الطراز قديمًا غريبًا ولكن أعتقد أنه لا يوجد خيار آخر لهذا النهج

نصائح أخرى

يمكنك الذهاب إلى المدرسة القديمة واستخدام FindStr في Process/ProcessStartInfo.

Findstr (أداة سطر أوامر) مدمجة في الخادم الخاص بك ويمكنها الوصول إلى أي موقع يمكن للمستخدم الذي تنتحل شخصيته الوصول إليه.

لقد جربت ذلك في تطبيق صغير من صفحة واحدة وتمكنت من قراءة/مسح الملفات على محرك الأقراص المحلي بالإضافة إلى مسارات UNC.

قد يكون هذا خيارًا لك.الإخراج هو النص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top