Option Strict On Option Explicit On Imports System.IO Imports System.Collections.Specialized Public Class FileSearch Private Const DefaultFileMask As String = "*.*" Private Const DefaultDirectoryMask As String = "*" #Region " Member Variables " Private _InitialDirectory As DirectoryInfo Private _DirectoryMasks As StringCollection Private _FileMasks As StringCollection ' Private _Directories As New ArrayList Private _Files As New ArrayList #End Region #Region " Properites " Public Property InitialDirectory() As DirectoryInfo Get Return _InitialDirectory End Get Set(ByVal Value As DirectoryInfo) _InitialDirectory = Value End Set End Property Public Property DirectoryMask() As StringCollection Get Return _DirectoryMasks End Get Set(ByVal Value As StringCollection) _DirectoryMasks = Value End Set End Property Public Property FileMask() As StringCollection Get Return _FileMasks End Get Set(ByVal Value As StringCollection) _FileMasks = Value End Set End Property Public ReadOnly Property Directories() As ArrayList Get Return _Directories End Get End Property Public ReadOnly Property Files() As ArrayList Get Return _Files End Get End Property #End Region #Region " Constructors " Public Sub New() End Sub Public Sub New( _ ByVal BaseDirectory As String) Me.New(New DirectoryInfo(BaseDirectory)) End Sub Public Sub New( _ ByVal InitialDirectory As DirectoryInfo) _InitialDirectory = InitialDirectory End Sub #End Region Public Overloads Sub Search(ByVal InitalDirectory As String, _ Optional ByVal FileMask As String = Nothing, _ Optional ByVal DirectoryMask As String = Nothing) Search( _ New DirectoryInfo(InitalDirectory), _ FileMask, _ DirectoryMask _ ) End Sub Public Overloads Sub Search( _ Optional ByVal InitalDirectory As DirectoryInfo = Nothing, _ Optional ByVal FileMask As String = Nothing, _ Optional ByVal DirectoryMask As String = Nothing) _Files = New ArrayList _Directories = New ArrayList If Not IsNothing(InitalDirectory) Then _InitialDirectory = InitalDirectory End If If IsNothing(_InitialDirectory) Then Throw New ArgumentException("A Directory Must be specified!", "Directory") End If If IsNothing(FileMask) OrElse FileMask.Length = 0 Then _FileMasks = New StringCollection _FileMasks.Add(DefaultFileMask) Else _FileMasks = ParseMask(FileMask) End If If IsNothing(DirectoryMask) OrElse DirectoryMask.Length > 0 Then _DirectoryMasks = New StringCollection _DirectoryMasks.Add(DefaultDirectoryMask) Else _DirectoryMasks = ParseMask(DirectoryMask) End If DoSearch(_InitialDirectory) End Sub Private Sub DoSearch(ByVal BaseDirectory As DirectoryInfo) Try For Each fm As String In _FileMasks Files.AddRange(BaseDirectory.GetFiles(fm)) Next _ Catch u As UnauthorizedAccessException 'Siliently Ignore this error, there isnt any simple 'way to avoid this error. End Try Try Dim Directories As New ArrayList For Each dm As String In _DirectoryMasks Directories.AddRange(BaseDirectory.GetDirectories(dm)) _Directories.AddRange(Directories) Next For Each di As DirectoryInfo In Directories DoSearch(di) Next Catch u As UnauthorizedAccessException 'Siliently Ignore this error, there isnt any simple 'way to avoid this error. End Try End Sub 'Masks are formated like *.jpeg;*.jpg Private Shared Function ParseMask(ByVal Mask As String) As StringCollection If IsNothing(Mask) Then Return Nothing End If Mask = Mask.Trim(";"c) If Mask.Length = 0 Then Return Nothing End If Dim Masks As New StringCollection Masks.AddRange(Mask.Split(";"c)) Return Masks End Function Protected Overrides Sub Finalize() _Files = Nothing _Directories = Nothing MyBase.Finalize() End Sub End Class
And here's how you use the class to search for files.
Dim x As New FileSearch() x.Search(selectedPath, "*.jpg;*.jpeg;*.tif;*.tiff") For Each imageFiles As FileInfo In x.Files 'Print Fullname of the matching files to debug window Debug.Print(imageFiles.FullName) next
0 comments:
Post a Comment