الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كلاس: البحث عن ملفات أو مجلدات أو كليهما

مغلق
بدأه محمد سامر أبو سلو في 11 مارس 2006 · 5 رد · 2,260 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قد يظن البعض أنني أكرر موضوعي السابق حول البحث عن ملفات ولكن هذا الموضوع هو تطوير للموضوع السابق

أثناء القيام بالاختبارات على الكلاس السابق وجدت أنه يسبب عدم استجابة البرنامج أثناء عملية البحث وحتى انتهائها لذلك كان لابد من بعض التعديلات على الكلاس حتى أتمكن من استخدامه في مسار thread مستقل والكلاس الجديد في المرفقات وسأقوم ببعض الشرح حول استخدامه

أولا نقوم بتعريف متغير يشير للكلاس مع استخدام العبارة WithEvents حتى نستفيد من الأحداث الخاصة به وخصوصا أن الحدث FinishedSearch الخاص بالكلاس هو ما سيعيد نتائج البحث

Dim WithEvents FFs As New FilesFoldersSearch

للبحث عن ملف في جميع الأقراص الصلبة نستخدم كود شبيه بالتالي

        ' ضبط محددات البحث
        FFs.SetSearchParams(FilesFoldersSearch.SearchForEn.Both, FilesFoldersSearch.SearchInEn.FixedDrives, "*.ini")
         ' تعريف المسار الجديد
        Dim thr As New Threading.Thread(AddressOf FFs.StartSearch)
        ' بدء المسار الجديد
        thr.Start()

حيث نقوم بضبط محددات البحث وذلك بتمريرها للإجراء SetSearchParams الخاص بضبط عمليات البحث

ثم نقوم بتعريف متغير thr الخاص بالمسار thread الجديد الذي ستجري فيه عملية البحث وذلك باستخدام الاجراء StartSearch للمسار الجديد ثم نبدأ المسار باستخدام الأمر Start

وإذا أردت إظهار مؤشر تقدم لعملية البحث ستحتاج لاستخدام الحدثين DrivesProgress و FFSearchProgress الخاصين بكلاس البحث وبافتراض أنك وضعت إثنان ProgressBar وتمت تسميتهما Pb1 و Pb2 فيكون كود إظهار التقدم على هذه المؤشرات

أولا في الاعلانات العامة للفورم نستخدم تعريف الـ delegate التاليين

    Private Delegate Sub CB_FFs_DrivesProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs)
    Private Delegate Sub CB_FFs_FFSearchProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs)

وذلك لاستخدامهما في عملية استعادة القيم من الكلاس - الموجود على مسار مختلف - وإظهارها

وبذلك يكون كود الحدثين

 Private Sub FFs_DrivesProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs) Handles FFs.DrivesProgress
        ' تحديد ما إذا كان الاجراء Invoke يجب استخدامه
        ' وذلك لأن المسار الثاني لايمكنه تغيير قيم التحكمات في المسار الرئيسي بأمان
        If Me.Pb2.InvokeRequired Then
            ' استخدام الاجراء Invoke حتى نستطيع استخدام القيم المعادة من الكلاس
            ' وإظهارها على التحكمات الموجودة على النافذة
            Dim d As New CB_FFs_DrivesProgress(AddressOf FFs_DrivesProgress)
            Me.Invoke(d, New Object() {sender, e})
        Else
            ' تحديث قيم مؤشر التقدم بالقيم المعادة من الكلاس
            Pb2.Minimum = e.Min
            Pb2.Maximum = e.Max
            Pb2.Value = e.CurPos
        End If
    End Sub

    Private Sub FFs_FFSearchProgress(ByVal sender As Object, ByVal e As FilesFoldersSearch.FileSearchProgressEeventArgs) Handles FFs.FFSearchProgress
        ' تحديد ما إذا كان الاجراء Invoke يجب استخدامه
        ' وذلك لأن المسار الثاني لايمكنه تغيير قيم التحكمات في المسار الرئيسي بأمان
        If Me.Pb1.InvokeRequired Then
            ' استخدام الاجراء Invoke حتى نستطيع استخدام القيم المعادة من الكلاس
            ' وإظهارها على التحكمات الموجودة على النافذة
            Dim d As New CB_FFs_FFSearchProgress(AddressOf FFs_FFSearchProgress)
            Me.Invoke(d, New Object() {sender, e})
        Else
            ' تحديث قيم مؤشر التقدم بالقيم المعادة من الكلاس
            Pb1.Minimum = e.Min
            Pb1.Maximum = e.Max
            Pb1.Value = e.CurPos
        End If
    End Sub

بقي علينا الآن انتظار انطلاق الحدث FinishedSearch الخاص بالكلاس والذي سيعيد إلينا نتائج البحث وسيكون الكود هنا شبيه جدا بكود الحدثين السابقين

أولا تعريف الـ delegate

Private Delegate Sub CB_FFs_FinishedSearch(ByVal sender As Object, ByVal e As FilesFoldersSearch.FinishedSearchProgressEeventArgs)

ثم إجراء الحدث بافتراض أنه لديك إثنان ListBox تريد إظهار نتائج البحث فيهما

Private Sub FFs_FinishedSearch(ByVal sender As Object, ByVal e As FilesFoldersSearch.FinishedSearchProgressEeventArgs) Handles FFs.FinishedSearch
        If Me.ListBox1.InvokeRequired Or Me.ListBox2.InvokeRequired Then
            Dim d As New CB_FFs_FinishedSearch(AddressOf FFs_FinishedSearch)
            Me.Invoke(d, New Object() {sender, e})
        Else
            ListBox1.Items.Clear()
            ListBox2.Items.Clear()
            ListBox1.Items.AddRange(e.FoundFiles.ToArray)
            ListBox2.Items.AddRange(e.FoundFolders.ToArray)
        End If
    End Sub

- مرفق مثال كامل يتضمن الكلاس واستخدامه عمليا

- الكلاس والمثال مطور على VB2005 ولا أجد ما يمنع محاولة استخدامه على VB2003

FilesFoldersSearch_Class.zip

FilesAndFoldrsSearch_Example.zip

تم تعديل هذه المشاركة بواسطة samerselo في 11 مارس 2006 في 16:23

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

وفيما يلي سرد كامل للكلاس المطور

Imports System.IO

' فئة خاصة الهدف منها القيام بالبحث عن ملفات أو مجلدات
' ضمن محركات الأقراص أو مجلد معين
Public Class FilesFoldersSearch

#Region " Declarations "

#Region " Results "

    ' المصفوفة التي ستحمل النتائج
    ' بالنسبة للملفات
    Private _FoundFiles As New ArrayList
    ' المصفوفة التي ستحمل النتائج
    ' بالنسبة للمجلدات
    Private _FoundFolders As New ArrayList

#End Region

#Region " Events "

    ' حدث ينطلق عند تقدم البحث
    Public Event FFSearchProgress(ByVal sender As Object, ByVal e As FileSearchProgressEeventArgs)
    ' حدث خاص للتقدم للأقراص
    Public Event DrivesProgress(ByVal sender As Object, ByVal e As FileSearchProgressEeventArgs)
    ' حدث خاص بانتهاء عملية البحث
    Public Event FinishedSearch(ByVal sender As Object, ByVal e As FinishedSearchProgressEeventArgs)

#End Region

#Region " Search Parameters "

    ' تحديد عن ماذا ستبحث
    Public Enum SearchForEn
        Files
        Folders
        Both
    End Enum

    ' تحديد في ماذا ستبحث
    Public Enum SearchInEn
        Folder
        FixedDrives
        AllDrives
    End Enum

    ' متغيرات تحديد البرامترات الابتدائية لعملية البحث
    ' بحث عن
    Private _SearchFor As SearchForEn
    ' بحث في
    Private _SearchIn As SearchInEn
    ' اسم الملف أو المجلد
    Private _FFName As String
    ' المجلد المبحوث فيه
    Private _SearchedFolder As String
    ' مؤشر هل تم ضبط بارامترات البحث أم لا
    Private _SearchParamsSet As Boolean = False

#End Region

#End Region

#Region " Class Body "

    ' مشيد الفئة
    Public Sub New()
        _FoundFiles.Clear()
        _FoundFolders.Clear()
    End Sub

    ''' <summary>
    ''' ضبط محددات البحث
    ''' </summary>
    ''' <param name="SearchFor">تحديد عن ماذا ستبحث</param>
    ''' <param name="SearchIn">تحديد في ماذا ستبحث</param>
    ''' <param name="FFNameTOFind">اسم الملف أو المجلد الذي تريد البحث عنه</param>
    ''' <param name="SearchedFolder"> بارامتر اختياري
    ''' اسم المجلد الذي تريد البحث فيه
    ''' وهو غير ضروري إلا إذا كنت تبحث في مجلد
    ''' SearchIn = SearchInEn.Folder
    ''' </param>
    ''' <remarks></remarks>
    Public Sub SetSearchParams(ByVal SearchFor As SearchForEn, ByVal SearchIn As SearchInEn, _
            ByVal FFNameTOFind As String, Optional ByVal SearchedFolder As String = "")
        _FoundFiles.Clear()
        _FoundFolders.Clear()
        _SearchFor = SearchFor
        _SearchIn = SearchIn
        _FFName = FFNameTOFind
        _SearchedFolder = SearchedFolder
        _SearchParamsSet = True
    End Sub

    ' بدء عملية البحث
    Public Sub StartSearch()
        If _SearchParamsSet = False Then
            ' إن لم يتم ضبط محددات البحث لا تقم بالبحث
            Exit Sub
        End If

        Select Case _SearchIn
            Case SearchInEn.FixedDrives, SearchInEn.AllDrives ' إذا كان البحث في الأقراص
                Dim Prg As Integer = 0

                _FoundFiles.Clear()
                _FoundFolders.Clear()
                For Each d As DriveInfo In DriveInfo.GetDrives
                    If _SearchIn = SearchInEn.FixedDrives Then ' في الأقراص الصلبة
                        If d.DriveType = DriveType.Fixed Then
                            FindFileFolder(d.RootDirectory.ToString, _FFName, _SearchFor)
                        End If
                    ElseIf _SearchIn = SearchInEn.AllDrives Then ' في جميع الأقراص
                        FindFileFolder(d.RootDirectory.ToString, _FFName, _SearchFor)
                    End If
                    ' اطلاق حدث التقدم بالنسبة للأقراص
                    Prg += 1
                    RaiseEvent DrivesProgress(Me, New FileSearchProgressEeventArgs(DriveInfo.GetDrives().Length, Prg))
                Next
                ' إطلاق حدث انتهاء عملية البحث
                _FoundFiles.TrimToSize()
                _FoundFolders.TrimToSize()
                RaiseEvent FinishedSearch(Me, New FinishedSearchProgressEeventArgs(_FoundFiles, _FoundFolders))

            Case SearchInEn.Folder ' إذا كان البحث في المجلدات
                _FoundFiles.Clear()
                _FoundFolders.Clear()
                FindFileFolder(_SearchedFolder, _FFName, _SearchFor)
                _FoundFiles.TrimToSize()
                _FoundFolders.TrimToSize()
                ' إطلاق حدث انتهاء عملية البحث
                RaiseEvent FinishedSearch(Me, New FinishedSearchProgressEeventArgs(_FoundFiles, _FoundFolders))

        End Select

    End Sub

    ' خاصية للقراءة فقط تعيد مصفوفة تحمل نتائج البحث
    ' بالنسبة للملفات
    Public ReadOnly Property FoundFiles() As ArrayList
        Get
            _FoundFiles.TrimToSize()
            Return _FoundFiles
        End Get
    End Property

    ' خاصية للقراءة فقط تعيد مصفوفة تحمل نتائج البحث
    ' بالنسبة للمجلدات
    Public ReadOnly Property FoundFolders() As ArrayList
        Get
            _FoundFolders.TrimToSize()
            Return _FoundFolders
        End Get
    End Property

    ''' <summary>
    ''' الإجراء الذي يقوم بعملية البحث
    ''' وهو إجراء يستخدم داخليا ضمن الكلاس
    ''' </summary>
    ''' <param name="dir">اسم المجلد الذي نبحث فيه</param>
    ''' <param name="FFName">اسم الملف أو المجلد الذي نبحث عنه</param>
    ''' <param name="SearchFor">تحديد عن ماذا سنبحث</param>
    ''' <param name="MainFolder">اختياري يستخدم داخليا ضمن الاجراء</param>
    ''' <param name="level">اختياري يستخدم داخليا ضمن الاجراء</param>
    ''' <remarks>
    ''' البارامترين الأخيري يستخدمان فقط من ضمن الاجراء
    ''' عندما يعيد تكرار نفسه للحصول على معلومات
    ''' المجلدات الفرعية للمجلد الذي نبحث فيه
    ''' </remarks>
    Private Sub FindFileFolder(ByVal dir As String, ByVal FFName As String, _
            ByVal SearchFor As SearchForEn, _
            Optional ByVal MainFolder As Boolean = True, Optional ByVal level As Integer = 0)

        Dim Prg As Integer = 0
        Try
            If SearchFor = SearchForEn.Files Or SearchFor = SearchForEn.Both Then
                '  Display  all  files  in  this  directory  with  correct  indentation. 
                For Each fname As String In Directory.GetFiles(dir, FFName)
                    _FoundFiles.Add(fname)
                Next
            End If
            If SearchFor = SearchForEn.Folders Or SearchFor = SearchForEn.Both Then
                For Each fname As String In Directory.GetDirectories(dir, FFName)
                    _FoundFolders.Add(fname)
                Next
            End If
            '  A  recursive  call  for  all  the  subdirectories  in  this  directory 
            For Each subdir As String In Directory.GetDirectories(dir)
                FindFileFolder(subdir, FFName, SearchFor, False, level + 1)
                If MainFolder = True Then
                    Prg += 1
                    Dim e As New FileSearchProgressEeventArgs(Directory.GetDirectories(dir).Length, Prg)
                    RaiseEvent FFSearchProgress(Me, e)
                End If
            Next
        Catch ex As Exception
            ex = Nothing
            '  Do  nothing  if  any  error  (presumably  “Drive  not  ready”). 
        End Try

    End Sub

#End Region

#Region " EventArgs Classes "

    ' كلاس خاص بإطلاق الأحداث الخاصة بعملية البحث
    Public Class FileSearchProgressEeventArgs
        Inherits System.EventArgs

        Private m_Min As Integer = 0
        Private m_Max As Integer = 100
        Private m_CurPos As Integer = 0

        Public ReadOnly Property Min()
            Get
                Return m_Min
            End Get
        End Property

        Public ReadOnly Property Max()
            Get
                Return m_Max
            End Get
        End Property

        Public ReadOnly Property CurPos()
            Get
                Return m_CurPos
            End Get
        End Property

        Public Sub New(ByVal Max As Integer, ByVal curPos As Integer, Optional ByVal Min As Integer = 0)
            m_Min = Min
            m_Max = Max
            m_CurPos = curPos
        End Sub

    End Class

    'كلاس خاص بحدث انتهاء عملية البحث
    Public Class FinishedSearchProgressEeventArgs
        Inherits System.EventArgs

        Private FS_FoundFiles As New ArrayList
        Private FS_FoundFolders As New ArrayList


        Public Sub New(ByVal FoundFiles As ArrayList, ByVal FoundFolders As ArrayList)
            FS_FoundFiles = FoundFiles
            FS_FoundFolders = FoundFolders
        End Sub

        Public ReadOnly Property FoundFiles() As ArrayList
            Get
                Return FS_FoundFiles
            End Get
        End Property

        Public ReadOnly Property FoundFolders() As ArrayList
            Get
                Return FS_FoundFolders
            End Get
        End Property

    End Class

#End Region

End Class

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

رائع أستاذي samerselo .. دائما مبدع

الله يعطيك العافية

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#4

لا شكر على واجب

وإذا في شي سؤال بخصوص الكلاس

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

بسم الله الرحمن الرحيم

شكرا الف شكر لك اخي العزيز

فعلا انت خبير فيجوال بيسك دوت نت

ولك خالص دعائي وامنياتي

اللهم لا سهل الا ماجعلته سهلا، وانت تجعل الصعب ان شئت سهلا

83_45a7168be2ddb.jpg

#6

وهذا أيضا تطوير آخر للكلاس يغطي بعض النواقص

- إمكانية إلغاء البحث في أي وقت

- إضافة حدثين يمكناك من متابعة الملفات و المجلدات التي تم إيجادها أثناء عملية البحث دون الحاجة لانتظار انتهاء عملية البحث للحصول على القائمة

مرفق الكلاس المطور مع برنامج تجريبي يوضح طريقة الاستخدام

Class.zip

ClassAndExample.zip

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة