منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : كيف يمكننا البحث عن ملف بمحتوى معين ضمن شجرة مجلدات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : samerselo

أنشئ مشروعا جديدا من النوع Windows Forms Application وضع على النافذة TextBox عدد 2 و Button عدد 2 و ListBox عدد 1 وإن أحببت المتابعة بتسمياتي قم بتسمية التحكمات السابقة كما يلي txtPath و txtContents و btnSelectFolder و btnSearch و lstResults
الآن أنشئ معالج لحدث النقر على كلا الزرين واجعل كود زر اختيار المجلد كما يلي


كود :
Private Sub btnSelectFolder_Click() Handles btnSelectFolder.Click
' اختيار المجلد
Dim sf As New FolderBrowserDialog
If sf.ShowDialog = Windows.Forms.DialogResult.OK Then
Me.txtPath.Text = sf.SelectedPath
End If
End Sub
من أجل الاستعلام عن الملفات المطلوبة سنحتاج إلى وظيفة تعيد لنا قائمة بالملفات الموجودة في شجرة مجلدات معينة حيث سنقوم بتمرير مسار المجلد الذي سنبدأ منه كمحدد وحيد لها وسيكون كودها على الشكل التالي حيث استخدمنا استعلام لينك يعيد لنا مجموعة من النوع FileInfo لقائمة الملفات الموجودة في شجرة المجلدات الممررة مستخدما الدالة GetFiles للحصول على قائمة الملفات المطلوبة


كود :
' إعادة قائمة بالملفات ضمن شجرة مجلدات معينة
Function GetFiles(ByVal root As String) As _
System.Collections.Generic.IEnumerable(Of System.IO.FileInfo)

Return From file In My.Computer.FileSystem.GetFiles _
(root, FileIO.SearchOption.SearchAllSubDirectories, "*.*") _
Select New System.IO.FileInfo(file)
End Function
وسنحتاج وظيفة أخرى تعيد لنا محتويات الملف الذي نقرأه عند الاستعلام حيث نمرر لها مسار ذلك الملف وسيكون كود هذه الوظيفة على الشكل التالي حيث استخدمنا الدالة ReadAllText لقراءة كافة محتويات الملف وإعادتها


كود :
' قراءة محتويات الملف
Function GetFileText(ByVal FileName As String) As String
' إن كان الملف موجودا أعد محتوياته وإلا أعد نصا فارغا
If System.IO.File.Exists(FileName) Then
Return System.IO.File.ReadAllText(FileName)
Else
Return String.Empty
End If
End Function
وسيكون كود زر البحث كالتالي


كود :
Private Sub btnSearch_Click() Handles btnSearch.Click
' التأكد من المسار وشرط البحث قبل المتابعة
If Me.txtPath.Text <> String.Empty _
And Directory.Exists(Me.txtPath.Text) _
And Me.txtContents.Text <> String.Empty Then
' الحصول على قائمة بالملفات
Dim fileList = GetFiles(Me.txtPath.Text)

' استخدام استعلام لينك للحصول على قائمة بالملفات التي تطابق شرط البحث
Dim queryMatchingFiles = From file In fileList _
Where file.Extension = ".htm" _
Let fileText = GetFileText(file.FullName) _
Where fileText.ToUpper.Contains(Me.txtContents.Text.ToUpper) _
Select file.FullName

' إظهار النتائج في صندوق القائمة
Me.lstResults.Items.Clear()
Me.lstResults.Items.AddRange(queryMatchingFiles.ToArray)

End If

MsgBox("Done.")
End Sub
حيث استخدمنا في البداية عبارة If للتحقق من نص البحث والمسار المطلوب قبل تنفيذ عملية البحث ثم قمنا بالحصول على قائمة الملفات ووضعها في المتغير fileList ثم استخدمنا استعلام لينك يستعلم من fileList وفي قسم Where حددنا أننا نريد البحث في الملفات التي تمتلك اللاحقة htm ثم أضفنا شرطا آخر لقسم Where بأننا نريد الحصول على الملفات التي تحتوي نصا معينا فقط وقمنا باستخدام الدالة ToUpper مع كلا النصين من أجل تجاهل حالة النص (حروف كبيرة أو صغيرة) ثم قمنا بإظهار نتائج الاستعلام في صندوق القائمة


فكرة لتطوير المشروع ولكن لن أنفذها أنا وأنتظر من أحد متابعي موضوعي تنفيذها وهي أنه إذا كانت شجرة المجلدات المبحوث فيها كبيرة فالبحث سيأخذ وقتا طويلا لذا يجب نقل تنفيذ الاستعلام إلى مسار آخر Another Thread وإظهار مؤشر بتقدم العملية باستخدام ProgressBar أسفل النافذة كما يمكن إضافة صندوق نصوص آخر على النافذة لجعل مستخدم تطبيقنا يحدد لاحقة الملفات التي يريد البحث فيها