Public Class Searcher
Dim _searchdir As String = "C:\"
Dim _searchterm As String = ""
Dim _searchbyindex As Boolean = False
Dim lastselectedindex As Integer = -1
Structure ResultInfo
Dim FileName As String
Dim ParentDirectory As String
End Structure
Dim t As System.Threading.Thread
Delegate Sub NoArgsD()
Delegate Sub AddResultDef(ByVal arg As ResultInfo)
Delegate Sub SetTextDef(ByVal text As String)
Dim doaddresult As AddResultDef = New AddResultDef(AddressOf AddResult)
Dim dosetsttext As SetTextDef = New SetTextDef(AddressOf SetStatusText)
Dim dofinished As NoArgsD = New NoArgsD(AddressOf Finished)
Public Sub New(ByVal searchterm As String, ByVal searchdir As String, Optional ByVal searchbyindex As Boolean = False)
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
_searchdir = searchdir
_searchterm = searchterm
_searchbyindex = searchbyindex
Dim fi As New IO.FileInfo("/qs_index.INDEX")
_searchbyindex = _searchbyindex And fi.Exists
fi = Nothing
End Sub
Private Sub Finished()
Me.lblCurrentSearch.Text = "Done."
Me.btnStopSearch.Visible = False
Dim f As New CMessageBox("Search complete.", "Search", SystemIcons.Information)
t = Nothing
End Sub
Public Sub Search()
t = New Threading.Thread(AddressOf InitSearch)
t.Start()
End Sub
Private Sub InitSearch()
Try
If Not _searchbyindex Then
DoSearch(_searchdir)
Me.Invoke(dofinished)
Else
IndexSearch()
End If
Catch ex As Threading.ThreadAbortException
Exit Sub
'Catch ex As Exception
' Dim f As New CMessageBox("An error occurred during the search." & vbCrLf & ex.Message, "Search Error", SystemIcons.Error)
' f.ShowDialog()
' Exit Sub
End Try
End Sub
Private Structure SFile
Dim Name As String
Dim FullName As String
Dim Directory As Boolean
Shared ReadOnly Property [Default]() As SFile
Get
Dim df As SFile
df.Directory = False
df.FullName = ""
df.Name = ""
Return df
End Get
End Property
End Structure
Private Sub IndexSearch(Optional ByVal repeatwithnormal As Boolean = False)
Dim cfile As SFile
Dim fs As New IO.FileStream("/qs_index.INDEX", IO.FileMode.Open, IO.FileAccess.Read)
Dim rf As New IO.StreamReader(fs)
Me.Invoke(dosetsttext, "Currently searching folders by index...")
While rf.Peek() > -1
Dim s As String = rf.ReadLine()
cfile.Directory = s.Contains("""DIR:""")
If cfile.Directory Then s = s.Remove(0, 6)
Dim arr() As String = s.Split("""""")
cfile.Name = arr(0)
cfile.FullName = arr(2)
If cfile.Name.Contains(_searchterm) OrElse cfile.Name Like _searchterm Then
Dim ri As ResultInfo
ri.FileName = cfile.Name
Dim fi As New IO.FileInfo(cfile.FullName)
ri.ParentDirectory = fi.Directory.FullName
fi = Nothing
Me.Invoke(doaddresult, ri)
End If
End While
If repeatwithnormal Then DoSearch(_searchdir)
Me.Invoke(dofinished)
End Sub
Private Sub DoSearch(ByVal dir As String)
Try
Dim di, cdi As System.IO.DirectoryInfo
Dim fi As System.IO.FileInfo
cdi = New IO.DirectoryInfo(dir)
If Not cdi.Exists Then Throw New IO.DirectoryNotFoundException()
If cdi.Name.Contains(_searchterm) OrElse cdi.Name Like _searchterm Then
Dim rs As ResultInfo
rs.FileName = cdi.Name
If Not cdi.Parent Is Nothing Then
rs.ParentDirectory = cdi.Parent.FullName
Else
rs.ParentDirectory = "My Computer"
End If
Me.Invoke(doaddresult, rs)
End If
For Each fi In cdi.GetFiles()
If fi.Name.Contains(_searchterm) Then
Dim ri As ResultInfo
ri.FileName = fi.Name
ri.ParentDirectory = cdi.FullName
Me.Invoke(doaddresult, ri)
End If
Next
For Each di In cdi.GetDirectories()
Me.Invoke(dosetsttext, "Currently Searching " & di.FullName)
DoSearch(di.FullName)
Next
Catch ex As System.UnauthorizedAccessException
Me.Invoke(dosetsttext, "!!! Access denied. Search resumes in 3 sec...")
Threading.Thread.Sleep(700)
Me.Invoke(dosetsttext, "!!! Access denied. Search resumes in 2 sec...")
Threading.Thread.Sleep(700)
Me.Invoke(dosetsttext, "!!! Access denied. Search resumes in 1 sec...")
Threading.Thread.Sleep(700)
Exit Sub
End Try
End Sub
Private Sub AddResult(ByVal result As ResultInfo)
Dim lvi As New ListViewItem(New String() {result.FileName, result.ParentDirectory})
Me.lstSearchResults.Items.Add(lvi)
lvi = Nothing
End Sub
Private Sub SetStatusText(ByVal str As String)
Me.lblCurrentSearch.Text = str
End Sub
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
If Not t Is Nothing Then
t.Abort()
End If
Me.Close()
End Sub
Private Sub btnStopSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopSearch.Click
t.Abort()
Me.btnStopSearch.Visible = False
Me.lblCurrentSearch.Text = "Search stopped."
End Sub
Private Sub lstSearchResults_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstSearchResults.SelectedIndexChanged
If Me.lstSearchResults.SelectedIndices.Count = 0 Then Exit Sub
lastselectedindex = Me.lstSearchResults.SelectedIndices(0)
Me.btnOpenFolder.Visible = True
End Sub
Private Sub btnOpenFolder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpenFolder.Click
Try
If lastselectedindex = -1 Then Exit Sub
Dim folder As String = Me.lstSearchResults.Items(lastselectedindex).SubItems(1).Text
Process.Start("explorer.exe", """" & folder & """")
Catch ex As Exception
Dim f As New CMessageBox("Could not open folder.", "Open In Folder", SystemIcons.Warning)
f.ShowDialog()
End Try
End Sub
End Class