for you to code better!

File search by index:

vb.net Code:
  1. Public Class Searcher
  2.     Dim _searchdir As String = "C:\"
  3.     Dim _searchterm As String = ""
  4.     Dim _searchbyindex As Boolean = False
  5.     Dim lastselectedindex As Integer = -1
  6.     Structure ResultInfo
  7.         Dim FileName As String
  8.         Dim ParentDirectory As String
  9.     End Structure
  10.     Dim t As System.Threading.Thread
  11.     Delegate Sub NoArgsD()
  12.     Delegate Sub AddResultDef(ByVal arg As ResultInfo)
  13.     Delegate Sub SetTextDef(ByVal text As String)
  14.     Dim doaddresult As AddResultDef = New AddResultDef(AddressOf AddResult)
  15.     Dim dosetsttext As SetTextDef = New SetTextDef(AddressOf SetStatusText)
  16.     Dim dofinished As NoArgsD = New NoArgsD(AddressOf Finished)
  17.     Public Sub New(ByVal searchterm As String, ByVal searchdir As String, Optional ByVal searchbyindex As Boolean = False)
  18.  
  19.         ' This call is required by the Windows Form Designer.
  20.         InitializeComponent()
  21.  
  22.         ' Add any initialization after the InitializeComponent() call.
  23.         _searchdir = searchdir
  24.         _searchterm = searchterm
  25.         _searchbyindex = searchbyindex
  26.         Dim fi As New IO.FileInfo("/qs_index.INDEX")
  27.         _searchbyindex = _searchbyindex And fi.Exists
  28.         fi = Nothing
  29.     End Sub
  30.     Private Sub Finished()
  31.         Me.lblCurrentSearch.Text = "Done."
  32.         Me.btnStopSearch.Visible = False
  33.         Dim f As New CMessageBox("Search complete.", "Search", SystemIcons.Information)
  34.         t = Nothing
  35.     End Sub
  36.     Public Sub Search()
  37.         t = New Threading.Thread(AddressOf InitSearch)
  38.         t.Start()
  39.     End Sub
  40.     Private Sub InitSearch()
  41.         Try
  42.             If Not _searchbyindex Then
  43.                 DoSearch(_searchdir)
  44.                 Me.Invoke(dofinished)
  45.             Else
  46.                 IndexSearch()
  47.             End If
  48.         Catch ex As Threading.ThreadAbortException
  49.             Exit Sub
  50.             'Catch ex As Exception
  51.             '    Dim f As New CMessageBox("An error occurred during the search." & vbCrLf & ex.Message, "Search Error", SystemIcons.Error)
  52.             '    f.ShowDialog()
  53.             '    Exit Sub
  54.         End Try
  55.     End Sub
  56.     Private Structure SFile
  57.         Dim Name As String
  58.         Dim FullName As String
  59.         Dim Directory As Boolean
  60.         Shared ReadOnly Property [Default]() As SFile
  61.             Get
  62.                 Dim df As SFile
  63.                 df.Directory = False
  64.                 df.FullName = ""
  65.                 df.Name = ""
  66.                 Return df
  67.             End Get
  68.         End Property
  69.     End Structure
  70.     Private Sub IndexSearch(Optional ByVal repeatwithnormal As Boolean = False)
  71.         Dim cfile As SFile
  72.         Dim fs As New IO.FileStream("/qs_index.INDEX", IO.FileMode.Open, IO.FileAccess.Read)
  73.         Dim rf As New IO.StreamReader(fs)
  74.         Me.Invoke(dosetsttext, "Currently searching folders by index...")
  75.         While rf.Peek() > -1
  76.             Dim s As String = rf.ReadLine()
  77.             cfile.Directory = s.Contains("""DIR:""")
  78.             If cfile.Directory Then s = s.Remove(0, 6)
  79.             Dim arr() As String = s.Split("""""")
  80.             cfile.Name = arr(0)
  81.             cfile.FullName = arr(2)
  82.             If cfile.Name.Contains(_searchterm) OrElse cfile.Name Like _searchterm Then
  83.                 Dim ri As ResultInfo
  84.                 ri.FileName = cfile.Name
  85.                 Dim fi As New IO.FileInfo(cfile.FullName)
  86.                 ri.ParentDirectory = fi.Directory.FullName
  87.                 fi = Nothing
  88.                 Me.Invoke(doaddresult, ri)
  89.             End If
  90.         End While
  91.         If repeatwithnormal Then DoSearch(_searchdir)
  92.         Me.Invoke(dofinished)
  93.     End Sub
  94.     Private Sub DoSearch(ByVal dir As String)
  95.         Try
  96.             Dim di, cdi As System.IO.DirectoryInfo
  97.             Dim fi As System.IO.FileInfo
  98.             cdi = New IO.DirectoryInfo(dir)
  99.             If Not cdi.Exists Then Throw New IO.DirectoryNotFoundException()
  100.             If cdi.Name.Contains(_searchterm) OrElse cdi.Name Like _searchterm Then
  101.                 Dim rs As ResultInfo
  102.                 rs.FileName = cdi.Name
  103.                 If Not cdi.Parent Is Nothing Then
  104.                     rs.ParentDirectory = cdi.Parent.FullName
  105.                 Else
  106.                     rs.ParentDirectory = "My Computer"
  107.                 End If
  108.                 Me.Invoke(doaddresult, rs)
  109.             End If
  110.             For Each fi In cdi.GetFiles()
  111.                 If fi.Name.Contains(_searchterm) Then
  112.                     Dim ri As ResultInfo
  113.                     ri.FileName = fi.Name
  114.                     ri.ParentDirectory = cdi.FullName
  115.                     Me.Invoke(doaddresult, ri)
  116.                 End If
  117.             Next
  118.             For Each di In cdi.GetDirectories()
  119.                 Me.Invoke(dosetsttext, "Currently Searching " & di.FullName)
  120.                 DoSearch(di.FullName)
  121.             Next
  122.         Catch ex As System.UnauthorizedAccessException
  123.             Me.Invoke(dosetsttext, "!!! Access denied. Search resumes in 3 sec...")
  124.             Threading.Thread.Sleep(700)
  125.             Me.Invoke(dosetsttext, "!!! Access denied. Search resumes in 2 sec...")
  126.             Threading.Thread.Sleep(700)
  127.             Me.Invoke(dosetsttext, "!!! Access denied. Search resumes in 1 sec...")
  128.             Threading.Thread.Sleep(700)
  129.             Exit Sub
  130.         End Try
  131.     End Sub
  132.     Private Sub AddResult(ByVal result As ResultInfo)
  133.         Dim lvi As New ListViewItem(New String() {result.FileName, result.ParentDirectory})
  134.         Me.lstSearchResults.Items.Add(lvi)
  135.         lvi = Nothing
  136.     End Sub
  137.     Private Sub SetStatusText(ByVal str As String)
  138.         Me.lblCurrentSearch.Text = str
  139.     End Sub
  140.  
  141.     Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
  142.         If Not t Is Nothing Then
  143.             t.Abort()
  144.         End If
  145.         Me.Close()
  146.     End Sub
  147.  
  148.     Private Sub btnStopSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopSearch.Click
  149.         t.Abort()
  150.         Me.btnStopSearch.Visible = False
  151.         Me.lblCurrentSearch.Text = "Search stopped."
  152.     End Sub
  153.  
  154.     Private Sub lstSearchResults_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstSearchResults.SelectedIndexChanged
  155.         If Me.lstSearchResults.SelectedIndices.Count = 0 Then Exit Sub
  156.         lastselectedindex = Me.lstSearchResults.SelectedIndices(0)
  157.         Me.btnOpenFolder.Visible = True
  158.     End Sub
  159.  
  160.     Private Sub btnOpenFolder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpenFolder.Click
  161.         Try
  162.             If lastselectedindex = -1 Then Exit Sub
  163.             Dim folder As String = Me.lstSearchResults.Items(lastselectedindex).SubItems(1).Text
  164.             Process.Start("explorer.exe", """" & folder & """")
  165.         Catch ex As Exception
  166.             Dim f As New CMessageBox("Could not open folder.", "Open In Folder", SystemIcons.Warning)
  167.             f.ShowDialog()
  168.         End Try
  169.     End Sub
  170. End Class