转—VB.Net递归文件搜索实例

VB.Net递归文件搜索实例

代码如下:

  1. Option Strict On

  2. Option Explicit On

  3. Imports System.IO

  4. Public Class FileSearch

  5. Private Const DefaultFileMask As String = "*.*"

  6. Private Const DefaultDirectoryMask As String = "*"

  7. #Region " Member Variables "

  8. Private _InitialDirectory As DirectoryInfo

  9. Private _DirectoryMask As String

  10. Private _FileMask As String

  11. '

  12. Private _Directories As New ArrayList

  13. Private _Files As New ArrayList

  14. #End Region

  15. #Region " Properites "

  16. Public Property InitialDirectory() As DirectoryInfo

  17. Get

  18. Return _InitialDirectory

  19. End Get

  20. Set(ByVal Value As DirectoryInfo)

  21. _InitialDirectory = Value

  22. End Set

  23. End Property

  24. Public Property DirectoryMask() As String

  25. Get

  26. Return _DirectoryMask

  27. End Get

  28. Set(ByVal Value As String)

  29. _DirectoryMask = Value

  30. End Set

  31. End Property

  32. Public Property FileMask() As String

  33. Get

  34. Return _FileMask

  35. End Get

  36. Set(ByVal Value As String)

  37. _FileMask = Value

  38. End Set

  39. End Property

  40. Public ReadOnly Property Directories() As ArrayList

  41. Get

  42. Return _Directories

  43. End Get

  44. End Property

  45. Public ReadOnly Property Files() As ArrayList

  46. Get

  47. Return _Files

  48. End Get

  49. End Property

  50. #End Region

  51. #Region " Constructors "

  52. Public Sub New()

  53. End Sub

  54. Public Sub New( _

  55. ByVal BaseDirectory As String, _

  56. Optional ByVal FileMask As String = DefaultFileMask, _

  57. Optional ByVal DirectoryMask As String = DefaultDirectoryMask)

  58. Me.New(New IO.DirectoryInfo(BaseDirectory), FileMask, DirectoryMask)

  59. End Sub

  60. Public Sub New( _

  61. ByVal BaseDirectory As DirectoryInfo, _

  62. Optional ByVal FileMask As String = DefaultFileMask, _

  63. Optional ByVal DirectoryMask As String = DefaultDirectoryMask)

  64. _InitialDirectory = BaseDirectory

  65. _FileMask = FileMask

  66. _DirectoryMask = DirectoryMask

  67. End Sub

  68. #End Region

  69. Protected Overrides Sub Finalize()

  70. _Files = Nothing

  71. _Directories = Nothing

  72. MyBase.Finalize()

  73. End Sub

  74. Public Sub Search( _

  75. Optional ByVal BaseDirectory As DirectoryInfo = Nothing, _

  76. Optional ByVal FileMask As String = Nothing, _

  77. Optional ByVal DirectoryMask As String = Nothing)

  78. If Not IsNothing(BaseDirectory) Then

  79. _InitialDirectory = BaseDirectory

  80. End If

  81. If IsNothing(_InitialDirectory) Then

  82. Throw New ArgumentException("A Directory Must be specified!", "Directory")

  83. End If

  84. If IsNothing(FileMask) Then

  85. _FileMask = DefaultFileMask

  86. Else

  87. _FileMask = FileMask

  88. End If

  89. If IsNothing(DirectoryMask) Then

  90. _DirectoryMask = DefaultDirectoryMask

  91. Else

  92. _DirectoryMask = DirectoryMask

  93. End If

  94. DoSearch(_InitialDirectory)

  95. End Sub

  96. Private Sub DoSearch(ByVal BaseDirectory As DirectoryInfo)

  97. Try

  98. _Files.AddRange(BaseDirectory.GetFiles(_FileMask))

  99. Catch u As UnauthorizedAccessException

  100. 'Siliently Ignore this error, there isnt any simple

  101. 'way to avoid this error.

  102. End Try

  103. Try

  104. Dim Directories() As DirectoryInfo = BaseDirectory.GetDirectories(_DirectoryMask)

  105. _Directories.AddRange(Directories)

  106. For Each di As DirectoryInfo In Directories

  107. DoSearch(di)

  108. Next

  109. Catch u As UnauthorizedAccessException

  110. 'Siliently Ignore this error, there isnt any simple

  111. 'way to avoid this error.

  112. End Try

  113. End Sub

  114. End Class

调用方法

代码如下:

  1. Dim x As New FileSearch(New IO.DirectoryInfo("d:\Media\"), "*.nfo")

  2. x.Search()

  3. MessageBox.Show(x.Files.Count) ' number of files that match "*.nfo" in D:\Media

  4. MessageBox.Show(x.Directories.Count) ' the total number of directories looked through