📄 rapifindfilesthread.vb
字号:
' RapiFindFilesThread.vb - Creates a background
' thread to retrieve file names from the device.
'
' Code from _Programming the .NET Compact Framework with C#_
' and _Programming the .NET Compact Framework with VB_
' (c) Copyright 2002-2003 Paul Yao and David Durant.
' All rights reserved.
Imports System
Imports System.Threading
Imports System.Collections
Imports System.Windows.Forms
Imports System.Diagnostics
Imports YaoDurant.Win32.Rapi
Namespace FindPrograms
_
' Reasons our thread invokes user-interface thread.
Public Enum INVOKE_FINDFILES
FINDFILE_QUERYSTARTPATH
FINDFILE_NEWFILE
FINDFILE_COMPLETE
STATUS_MESSAGE
End Enum 'INVOKE_FINDFILES
_
'/ <summary>
'/ FindFilesThread wraps a thread that supports
'/ RAPI search of device directory.
'/ </summary>
Public Class FindFilesThread
Public strBuffer As String ' Inter-thread buffer
Public itReason As INVOKE_FINDFILES ' Inter-thread reason
Private m_thrd As Thread = Nothing ' The contained thread
Private m_ctlInvokeTarget As Control ' Inter-thread control
Private m_deleCallback As EventHandler ' Inter-thread delegate
Private m_bContinue As Boolean ' Continue flag.
Private m_bIncludeSubDirs As Boolean = False ' Search sub-dirs
Private m_cFiles As Integer = 0 ' Find-File counter.
Public Property bThreadContinue() As Boolean ' Continue property.
Get
Return m_bContinue
End Get
Set
m_bContinue = value
End Set
End Property
'/ <summary>
'/ FindFilesThread - Constructor.
'/ </summary>
'/ <param name="ctl">Owner control</param>
'/ <param name="dele">Delegate to invoke</param>
Public Sub New(ctl As Control, dele As EventHandler)
bThreadContinue = True
m_ctlInvokeTarget = ctl ' Who to call.
m_deleCallback = dele ' How to call.
End Sub 'New
'/ <summary>
'/ Run - Init function for find-files thread.
'/ </summary>
'/ <param name="bSubDirs"></param>
'/ <returns></returns>
Public Function Run(bSubDirs As Boolean) As Boolean
Dim ts As ThreadStart = Nothing
ts = New ThreadStart(AddressOf ThreadMainFindFiles)
If ts Is Nothing Then
Return False
End If
m_bIncludeSubDirs = bSubDirs
m_thrd = New Thread(ts)
m_thrd.Start()
Return True
End Function 'Run
'/ <summary>
'/ ThreadMainFindFiles - Main thread for file find thread
'/ </summary>
Private Sub ThreadMainFindFiles()
Dim cTicks As Integer = Environment.TickCount
itReason = INVOKE_FINDFILES.FINDFILE_QUERYSTARTPATH
m_ctlInvokeTarget.Invoke(m_deleCallback)
Dim strPath As String = strBuffer
AddProgramsInDirectory(strPath)
Dim cSeconds As Integer = _
(Environment.TickCount - cTicks + 500) / 1000
If bThreadContinue Then
' Send message for search time.
strBuffer = "Ready - " + m_cFiles.ToString() + _
" programs found in " + cSeconds.ToString() + _
" seconds."
itReason = INVOKE_FINDFILES.STATUS_MESSAGE
m_ctlInvokeTarget.Invoke(m_deleCallback)
' Trigger that search is done.
itReason = INVOKE_FINDFILES.FINDFILE_COMPLETE
m_ctlInvokeTarget.Invoke(m_deleCallback)
End If
End Sub 'ThreadMainFindFiles
'/ <summary>
'/ AddProgramsInDirectory - Recursive function to search
'/ into directory tree.
'/ </summary>
'/ <param name="strDir">Starting directory</param>
'/ <returns></returns>
Private Function _
AddProgramsInDirectory(ByVal strDir As String) As Boolean
Trace.WriteLine(("FindPrograms: " + _
"AddProgramsInDirectory (" + strDir + ")"))
' Update status bar through delegate function.
strBuffer = "Searching in " + strDir + "..."
itReason = INVOKE_FINDFILES.STATUS_MESSAGE
m_ctlInvokeTarget.Invoke(m_deleCallback)
' As we add programs, store directory names.
Dim alDirectories As New ArrayList
Dim fd As New Rapi.CE_FIND_DATA
' Start our search.
Dim strSearch As String = strDir + "*.*"
Dim hff As IntPtr = Rapi.CeFindFirstFile(strSearch, fd)
If hff.ToInt32 = -1 Then
FetchAndDisplayError()
Else
Do
Dim strFileName As String = fd.cFileName
Dim iFlag As Integer = _
CInt(Rapi.FILE_ATTRIBUTE.FILE_ATTRIBUTE_DIRECTORY)
If (fd.dwFileAttributes And iFlag) = iFlag Then
alDirectories.Add((strDir + fd.cFileName))
Else
If strFileName.EndsWith(".EXE") Or _
strFileName.EndsWith(".exe") Then
m_cFiles += 1
strBuffer = strDir + fd.cFileName
itReason = INVOKE_FINDFILES.FINDFILE_NEWFILE
m_ctlInvokeTarget.Invoke(m_deleCallback)
End If
End If
Loop While bThreadContinue And _
Rapi.CeFindNextFile(hff, fd) <> 0
If bThreadContinue And m_bIncludeSubDirs Then
Dim str As String
For Each str In alDirectories
AddProgramsInDirectory((str + "\"))
Next str
End If
End If
Rapi.CeFindClose(hff)
Return True
End Function 'AddProgramsInDirectory
'/ <summary>
'/ FetchAndDisplayError - Display error in status bar
'/ </summary>
Public Sub FetchAndDisplayError()
strBuffer = String.Empty
' Is this a RAPI error?
Dim err As Integer = Rapi.CeRapiGetError()
If err <> Rapi.S_OK Then
strBuffer = "RAPI Error (0x" + _
CInt(err).ToString("x") + ")"
Else
' Check for CE error.
err = Rapi.CeGetLastError()
If err <> CInt(Rapi.RAPI_ERROR.ERROR_FILE_NOT_FOUND) Then
strBuffer = "CE Error (code = " + _
err.ToString("x") + ")"
End If
End If
If strBuffer <> String.Empty Then
itReason = INVOKE_FINDFILES.STATUS_MESSAGE
m_ctlInvokeTarget.Invoke(m_deleCallback)
End If
' Trigger that thread has ended.
m_thrd = Nothing
End Sub 'FetchAndDisplayError
End Class 'FindFilesThread ' class FindFilesThread
End Namespace 'FindPrograms ' namespace FindPrograms
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -