1

すべてのドライブ、ファイル、およびサブフォルダーをツリービューで表示する最も簡単な方法を探しています。誰かがこれを行うためのコードのスニペットを持っていて、共有してもかまわない場合は、本当に感謝します。

私が得た最も近いものは、私が使用しようとしたこのコードでしたが、「デバイスの準備ができていません」という「IOException was unhandled」というエラーが表示されました。以下の行の実行時(約5〜10秒後)のエラー

Dim folders() As String = IO.Directory.GetDirectories(dir)

その下に残りのコードがあります

Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim drives As System.Collections.ObjectModel.ReadOnlyCollection(Of IO.DriveInfo) = My.Computer.FileSystem.Drives
    Dim rootDir As String = String.Empty
    For i As Integer = 0 To drives.Count - 1
        rootDir = drives(i).Name
        TreeView1.Nodes.Add(rootDir)
        PopulateTreeView(rootDir, TreeView1.Nodes(i))
    Next
End Sub

Private Sub PopulateTreeView(ByVal dir As String, ByVal parentNode As TreeNode)
    Dim folder As String = String.Empty
    Try
        Dim folders() As String = IO.Directory.GetDirectories(dir)
        If folders.Length <> 0 Then
            Dim childNode As TreeNode = Nothing
            For Each folder In folders
                childNode = New TreeNode(folder)
                parentNode.Nodes.Add(childNode)
                PopulateTreeView(folder, childNode)
            Next
        End If
    Catch ex As UnauthorizedAccessException
        parentNode.Nodes.Add(folder & ": Access Denied")
    End Try
End Sub
4

1 に答える 1

1

いいスタートを切れたようですね。受け取ったIOExceptionエラーは、手順が空のディスク ドライブの内容をリストしようとしたことが原因である可能性が高く、これは明らかに不可能です。

修正は簡単です:

For i As Integer = 0 To drives.Count - 1
    If Not drives(i).IsReady Then
        Continue For
    End If
    rootDir = drives(i).Name
    TreeView1.Nodes.Add(rootDir)
    PopulateTreeView(rootDir, TreeView1.Nodes(i))
Next

それに加えて、ノードがクリックされるまでフォルダーの内容をロードしないことをお勧めします。再帰呼び出しを 1 レベル (現在のディレクトリ + そのすべてのサブディレクトリの内容) に制限します。こうすることで、サブディレクトリにツリービューの展開ボタンを配置する必要があるかどうかを判断しながら、最高のパフォーマンスを得ることができます。

于 2013-08-06T22:27:00.323 に答える