再帰的関数のすすめ

再帰関数が一発で決まると快感よね。
①TreeViewでエクスプローラ

    ''' <summary>
    ''' 対象フォルダを読み込み中身をツリービューに表示する
    ''' </summary>
    ''' <param name="avTargetTrv">対象ツリービューコントロール</param>
    ''' <param name="avTargetDir">対象フォルダ</param>
    ''' <param name="avParentNode">追加先ノード。未指定の場合ツリービューにノード新規作成</param>
    Public Sub ReadDirToTree(ByVal avTargetTrv As TreeView, ByVal avTargetDir As String, Optional ByVal avParentNode As TreeNode = Nothing)
        Try
            '親フォルダをツリービューに追加
            If IsNothing(avParentNode) Then
                '親ノード指定なし
                avParentNode = avTargetTrv.Nodes.Add("", GetDirName(avTargetDir))
            Else
                '親ノード指定あり
                avParentNode = avParentNode.Nodes.Add("", GetDirName(avTargetDir))
            End If
            '親ノードタグにフォルダパスをセット
            avParentNode.Tag = avTargetDir

            'フォルダを取得
            Dim rvDirs As New List(Of String)
            rvDirs.AddRange(IO.Directory.GetDirectories(avTargetDir, "*", IO.SearchOption.TopDirectoryOnly))

            '子フォルダがあった場合、再帰的にmsReadDirをコールする
            For I As Integer = 0 To rvDirs.Count - 1
                ReadDirToTree(avTargetTrv, rvDirs(I), avParentNode)
            Next

            ''ファイルを取得
            Dim rvFiles As New List(Of String)
            rvFiles.AddRange(IO.Directory.GetFiles(avTargetDir, "*", IO.SearchOption.TopDirectoryOnly))

            'ファイル数分ノードを追加
            For I As Integer = 0 To rvFiles.Count - 1
                avParentNode.Nodes.Add("", IO.Path.GetFileName(rvFiles(I))).Tag = rvFiles(I)
            Next

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    ''' <summary>
    ''' 終端フォルダ名の取得
    ''' </summary>
    ''' <param name="avTarget"></param>
    ''' <returns></returns>
    Private Function GetDirName(ByVal avTarget As String) As String
        Dim rvRep As String = ""
        Try
            Dim rvSplit As String() = Split(avTarget, "\")
            rvRep = rvSplit(rvSplit.Length - 1)

        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            GetDirName = rvRep
        End Try
    End Function

②Treeviewの全ノードを文字列検索

    ''' <summary>
    ''' 全ノードの検索処理
    ''' </summary>
    ''' <param name="avTargetTrv"></param>
    ''' <param name="avFindStr"></param>
    Private Sub AllNodeSearch(ByVal avTargetTrv As TreeView, ByVal avFindStr As String)
        Try
            If String.IsNullOrEmpty(avFindStr) = False Then
                Cursor = Cursors.WaitCursor
                avTargetTrv.SuspendLayout()

                '全ノードを検索
                For Each node As TreeNode In avTargetTrv.Nodes
                    SearchNodes(avFindStr, node)
                Next
            End If

        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            avTargetTrv.ResumeLayout()
            Cursor = Cursors.Default
        End Try
    End Sub

    ''' <summary>
    ''' 対象ノードに検索文字列が含まれているかチェック
    ''' </summary>
    ''' <param name="avFindStr"></param>
    ''' <param name="avTargetNode"></param>
    Private Sub SearchNodes(ByVal avFindStr As String, ByVal avTargetNode As TreeNode)
        Try
            If InStr(avTargetNode.Text, (Trim(avFindStr)), CompareMethod.Text) > 0 Then
                '検索文字列に引っかかったら背景色を黄色にする
                avTargetNode.BackColor = Color.Yellow
            Else
                '背景色を戻す
                avTargetNode.BackColor = Nothing
            End If
            '子ノードがあれば再帰的に呼び出し
            For Each childNode As TreeNode In avTargetNode.Nodes
                SearchNodes(avFindStr, childNode)
            Next
        Catch ex As Exception
            Throw ex
        End Try
    End Sub