Imports System.IO
Imports System.Threading
'------------------
'Creator: aeonhack
'Site: elitevs.net
'Created: 4/17/2011
'Changed: 4/24/2012
'Version: 1.1.0
'------------------
Class FileSearch
Private Callback As CallbackCB
Public Delegate Sub CallbackCB()
Sub New(_callback As CallbackCB)
Callback = _callback
_Files = New List(Of String)
End Sub
Private _Files As List(Of String)
ReadOnly Property Files As String()
Get
SyncLock _Files
Return _Files.ToArray()
End SyncLock
End Get
End Property
Private _Pattern As String
ReadOnly Property Pattern As String
Get
Return _Pattern
End Get
End Property
Private _Searching As Boolean
ReadOnly Property Searching As Boolean
Get
Return _Searching
End Get
End Property
Private _ShowHiddenFiles As Boolean = True
Property ShowHiddenFiles() As Boolean
Get
Return _ShowHiddenFiles
End Get
Set(ByVal value As Boolean)
_ShowHiddenFiles = value
End Set
End Property
Public Sub Search(path As String, pattern As String)
If _Searching Then Return
Track = 0
_Searching = True
_Pattern = pattern
_Files = New List(Of String)
_Cancel = False
Dim T As New Thread(AddressOf Initialize)
T.IsBackground = True
T.Start(path)
End Sub
Private Sub Initialize(data As Object)
Process(DirectCast(data, String))
End Sub
Private Track As Integer
Private Sub Search(data As Object)
If _Cancel Then Return
Dim Path As String = DirectCast(data, String)
Try
For Each P As String In Directory.GetDirectories(Path)
If _ShowHiddenFiles Then
Process(P)
ElseIf Not IsHidden((New DirectoryInfo(P)).Attributes) Then
Process(P)
End If
Next
Catch
'Do nothing
End Try
Try
SyncLock _Files
If _ShowHiddenFiles Then
_Files.AddRange(Directory.GetFiles(Path, _Pattern))
Else
For Each F As String In Directory.GetFiles(Path, _Pattern)
If Not IsHidden(File.GetAttributes(F)) Then _Files.Add(F)
Next
End If
End SyncLock
Catch
'Do nothing.
End Try
SyncLock Me
Track -= 1
If Track = 0 Then
_Searching = False
If Callback IsNot Nothing Then Callback()
End If
End SyncLock
End Sub
Private Sub Process(path As String)
SyncLock Me
Track += 1
End SyncLock
If Not ThreadPool.QueueUserWorkItem(AddressOf Search, path) Then Search(path)
End Sub
Private _Cancel As Boolean
Public Sub Cancel()
_Cancel = True
_Searching = False
End Sub
Public Sub Clear()
_Files.Clear()
End Sub
Private Function IsHidden(a As FileAttributes) As Boolean
If ((a And FileAttributes.Hidden) = FileAttributes.Hidden) Then Return True
If ((a And FileAttributes.System) = FileAttributes.System) Then Return True
Return False
End Function
End Class
Comments