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

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

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

أضع هنا كلاس يفيد في البحث عن ملف أو مجموعة ملفات في جهاز الحاسب أرجو أن يكون مفيدا

Imports System.IO

Public Class FileSearch

#Region " Declarations "

    ' المصفوفة التي ستحمل النتائج
    Private _FoundFiles As New ArrayList
    ' حدث ينطلق عند تقدم البحث
    Public Event FileSearchProgress(ByVal sender As Object, ByVal e As FileSearchProgressEeventArgs)
    ' حدث خاص للتقدم للأقراص
    Public Event DrivesProgress(ByVal sender As Object, ByVal e As FileSearchProgressEeventArgs)

#End Region

    ' مشيد الفئة
    Sub New()
        ' التأكد من أن القائمة فارغة
        _FoundFiles.Clear()
    End Sub

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

    ' إجراء البحث عن الملفات في الأقراص
    ' FileName اسم الملف المراد البحث عنه
    ' FixedOnly للبحث في جميع الأقراص أو في الأقراص الصلبة
    Public Function FindFileDrives(ByVal FileName As String, Optional ByVal FixedOnly As Boolean = True) As Boolean
        Dim Prg As Integer = 0

        _FoundFiles.Clear()
        For Each d As DriveInfo In DriveInfo.GetDrives
            If FixedOnly = True Then
                If d.DriveType = DriveType.Fixed Then
                    FindFile(d.RootDirectory.ToString, FileName)
                End If
            Else
                FindFile(d.RootDirectory.ToString, FileName)
            End If
            Prg += 1
            Dim e As New FileSearchProgressEeventArgs(DriveInfo.GetDrives().Length, Prg)
            RaiseEvent DrivesProgress(Me, e)
        Next
        _FoundFiles.TrimToSize()
        If _FoundFiles.Count > 0 Then
            Return True
        Else
            Return False
        End If
    End Function

    ' إجراء البحث عن الملفات في مجلد معين
    ' FileName اسم الملف المراد البحث عنه
    ' Foldername اسم المجلد المراد البحث فيه
    Public Function FindFileInFolder(ByVal FileName As String, ByVal FolderName As String) As Boolean
        _FoundFiles.Clear()
        FindFile(FolderName, FileName)
        _FoundFiles.TrimToSize()
        If _FoundFiles.Count > 0 Then
            Return True
        Else
            Return False
        End If
    End Function

    ' الإجراء الذي يقوم بعملية البحث
    Private Sub FindFile(ByVal dir As String, ByVal FileName As String, Optional ByVal MainFolder As Boolean = True, Optional ByVal level As Integer = 0)
        Dim Prg As Integer = 0
        Try
            '  Display  all  files  in  this  directory  with  correct  indentation. 
            For Each fname As String In Directory.GetFiles(dir, FileName)
                _FoundFiles.Add(fname)
            Next
            '  A  recursive  call  for  all  the  subdirectories  in  this  directory 
            For Each subdir As String In Directory.GetDirectories(dir)
                FindFile(subdir, FileName, False, level + 1)
                If MainFolder = True Then
                    Prg += 1
                    Dim e As New FileSearchProgressEeventArgs(Directory.GetDirectories(dir).Length, Prg)
                    RaiseEvent FileSearchProgress(Me, e)
                End If
            Next
        Catch ex As Exception
            ex = Nothing
            '  Do  nothing  if  any  error  (presumably  “Drive  not  ready”). 
        End Try

    End Sub

    ' كلاس خاص بإطلاق الأحداث الخاصة بعملية البحث
    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

End Class

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

انظر المثال المرفق وهو مكتوب على الـ 2005

FileSearchClass.zip

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

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

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

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

#2

سأشرح الآن بعض النقاط الخاصة باستخدام هذا الكلاس - راجع المثال المرفق سابقا -

أولا نقوم بتعريف متغير خاص له وذلك على مستوى الفورم الذي نعمل عليه

Private WithEvents FS As New FileSearch

نعرف الحدثين الخاصين بالكلاس كي نستطيع إظهار مؤشر للتقدم بافتراض أن لدينا اثنان progress bar باسم pb1 و pb2 ثم نربط القيم المعادة من الأحداث بالمتغير e مع مؤشري التقدم كما في الكود

   Private Sub FS_DrivesProgress(ByVal sender As Object, ByVal e As FileSearch.FileSearchProgressEeventArgs) Handles FS.DrivesProgress
        Pb2.Minimum = e.Min
        Pb2.Maximum = e.Max
        Pb2.Value = e.CurPos
    End Sub

    Private Sub FS_FileSearchProgress(ByVal sender As Object, ByVal e As FileSearch.FileSearchProgressEeventArgs) Handles FS.FileSearchProgress
        Pb1.Minimum = e.Min
        Pb1.Maximum = e.Max
        Pb1.Value = e.CurPos
    End Sub

و بافتراض أنه لدينا listbox باسم listbox1 نريد اظهار النتائج فيها يمكن أن نستخدم كود كالتالي للبحث عن ملف في مجلد

      ListBox1.Items.Clear()
        If FS.FindFileInFolder(TextBox2.Text, TextBox1.Text) = True Then
            ListBox1.Items.AddRange(FS.Foundfiles.ToArray)
        Else
            MsgBox("No Files Found")
        End If

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

وللقيام بالبحث ضمن الأقراص الصلبة نستخدم الإجراء FindFileDrives ونمرر له بارامتر واحد فقط هو اسم الملف المراد البحث عنه

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ListBox1.Items.Clear()
        If FS.FindFileDrives(TextBox2.Text) = True Then
            ListBox1.Items.AddRange(FS.Foundfiles.ToArray)
        Else
            MsgBox("No Files Found")
        End If
    End Sub

وللقيام بالبحث ضمن جميع الأقراص نستخدم الإجراء FindFileDrives مع تمرير بارامتر اختياري له بقيمة False بالإضافة للبارامتر الأول الخاص باسم الملف

 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ListBox1.Items.Clear()
        If FS.FindFileDrives(TextBox2.Text, False) = True Then
            ListBox1.Items.AddRange(FS.Foundfiles.ToArray)
        Else
            MsgBox("No Files Found")
        End If
    End Sub

تم تعديل هذه المشاركة بواسطة samerselo في 8 مارس 2006 في 13:57

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

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

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

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

#4

شكرا لك أخ حازم على المرور والرد

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

Imports System.IO

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

#Region " Declarations "

    ' المصفوفة التي ستحمل النتائج
    Private _FoundFiles As New ArrayList
    ' المصفوفة التي ستحمل النتائج
    Private _FoundFolders As New ArrayList
    ' حدث ينطلق عند تقدم البحث
    Public Event FFSearchProgress(ByVal sender As Object, ByVal e As FileSearchProgressEeventArgs)
    ' حدث خاص للتقدم للأقراص
    Public Event DrivesProgress(ByVal sender As Object, ByVal e As FileSearchProgressEeventArgs)
    ' تحديد عن ماذا ستبحث
    Public Enum SearchForEn
        Files
        Folders
        Both
    End Enum

#End Region

    ' مشيد الفئة
    Sub New()
        ' التأكد من أن القائمة فارغة
        _FoundFiles.Clear()
        _FoundFolders.Clear()
    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

    ' إجراء البحث عن الملفات في الأقراص
    ' FFName اسم الملف أو المجلد المراد البحث عنه
    ' FixedOnly للبحث في جميع الأقراص أو في الأ1قراص الصلبة فقط
    Public Function FindInDrives(ByVal FFName As String, _
    Optional ByVal SearchFor As SearchForEn = SearchForEn.Files, _
    Optional ByVal FixedOnly As Boolean = True) As Boolean

        Dim Prg As Integer = 0

        _FoundFiles.Clear()
        _FoundFolders.Clear()
        For Each d As DriveInfo In DriveInfo.GetDrives
            If FixedOnly = True Then
                If d.DriveType = DriveType.Fixed Then
                    FindFileFolder(d.RootDirectory.ToString, FFName, SearchFor)
                End If
            Else
                FindFileFolder(d.RootDirectory.ToString, FFName, SearchFor)
            End If
            Prg += 1
            Dim e As New FileSearchProgressEeventArgs(DriveInfo.GetDrives().Length, Prg)
            RaiseEvent DrivesProgress(Me, e)
        Next
        _FoundFiles.TrimToSize()
        _FoundFolders.TrimToSize()
        If _FoundFiles.Count > 0 Or _FoundFolders.Count > 0 Then
            Return True
        Else
            Return False
        End If
    End Function

    ' إجراء البحث عن الملفات في مجلد معين
    ' FFName اسم الملف او المجلد المراد البحث عنه
    ' Foldername اسم المجلد المراد البحث فيه
    Public Function FindInFolder(ByVal FFName As String, ByVal FolderName As String, _
            Optional ByVal SearchFor As SearchForEn = SearchForEn.Files) As Boolean
        _FoundFiles.Clear()
        _FoundFolders.Clear()
        FindFileFolder(FolderName, FFName, SearchFor)
        _FoundFiles.TrimToSize()
        _FoundFolders.TrimToSize()
        If _FoundFiles.Count > 0 Or _FoundFolders.Count > 0 Then
            Return True
        Else
            Return False
        End If
    End Function

    ' الإجراء الذي يقوم بعملية البحث
    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

    ' كلاس خاص بإطلاق الأحداث الخاصة بعملية البحث
    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

End Class

مرفق مثال عملي على استخدام الكلاس و أيضا مكتوب على الـ 2005

FilesAndFoldrsSearch.zip

تم تعديل هذه المشاركة بواسطة samerselo في 8 مارس 2006 في 20:55

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

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

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

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

#5

و استخدام الكلاس لم يتغير كثيرا على سبيل المثال كود البحث ضمن مجلد كان

ListBox1.Items.Clear()
       If FS.FindFileInFolder(TextBox2.Text, TextBox1.Text) = True Then
           ListBox1.Items.AddRange(FS.Foundfiles.ToArray)
       Else
           MsgBox("No Files Found")
       End If

وأصبح

        ListBox1.Items.Clear()
        ListBox2.Items.Clear()
        Dim SCond As FilesFoldersSearch.SearchForEn
        If Me.RadioButton1.Checked = True Then
            SCond = FilesFoldersSearch.SearchForEn.Files
        ElseIf Me.RadioButton2.Checked = True Then
            SCond = FilesFoldersSearch.SearchForEn.Folders
        ElseIf Me.RadioButton3.Checked = True Then
            SCond = FilesFoldersSearch.SearchForEn.Both
        End If
        FFs.FindInFolder(TextBox2.Text, TextBox1.Text, SCond)
        ListBox1.Items.AddRange(FFs.FoundFiles.ToArray)
        ListBox2.Items.AddRange(FFs.FoundFolders.ToArray)

حيث تم إضافة خاصية إضافية للعودة بأسماء المجلدات وتمت إضافة متغير يحدد ما نريد البحث عنه ملف أو مجلد أو كليهما وبقي استخدام الكلاس بنفس الطريقة القديمة

ولتفاصيل الاستخدام راجع المثال المرفق الذي يتضمن الكلاس كاملا

تم تعديل هذه المشاركة بواسطة samerselo في 8 مارس 2006 في 20:54

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

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

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

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

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…