Option Explicit On
Option Strict On
Option Infer Off
Public Class frmDirectoryMenuTest
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim RootPath As String
RootPath = "C:\"
BuildMenuFromPathData(RootPath, tsmiRootItem)
End Sub
Private Function BuildMenuFromPathData(RootPath As String, MenuParent As ToolStripItem) As Boolean
Dim DirList As List(Of String), Dir As String
Dim SubDir As String, File As String
Dim CurrentDirectoryMenuItem As ToolStripItem
Try
If RootPath.EndsWith(IO.Path.DirectorySeparatorChar) Then MenuParent.Text = IO.Path.GetFileName(RootPath.Remove(RootPath.Length - 1, 1)) Else MenuParent.Text = IO.Path.GetFileName(RootPath)
DirList = ListDirs(RootPath)
For Each Dir In DirList
CurrentDirectoryMenuItem = CreateToolStripDropDownItem(IO.Path.GetFileName(Dir), MenuParent)
For Each SubDir In ListDirs(Dir)
BuildMenuFromPathData(SubDir, CreateToolStripDropDownItem(SubDir, CurrentDirectoryMenuItem))
Next
CreateToolStripDropDownItems(ListFiles(Dir), CurrentDirectoryMenuItem)
Next
CreateToolStripDropDownItems(ListFiles(RootPath), MenuParent)
Return True
Catch ex As Exception
Return False
End Try
End Function
Private Function CreateToolStripDropDownItem(Text As String, ParentItem As ToolStripItem) As ToolStripItem
If ParentItem Is Nothing Then Return Nothing Else Return DirectCast(DirectCast(ParentItem, ToolStripMenuItem).DropDownItems.Add(Text), ToolStripItem)
End Function
Private Function CreateToolStripDropDownItems(ItemTexts As List(Of String), ParentItem As ToolStripItem) As ToolStripItem
If ItemTexts Is Nothing OrElse ParentItem Is Nothing Then Return ParentItem
For Each ItemText As String In ItemTexts
DirectCast(ParentItem, ToolStripMenuItem).DropDownItems.Add(ItemText)
Next
Return ParentItem
End Function
Private Function ListDirs(Path As String) As List(Of String)
Dim DirList As New List(Of String)
Dim Index As Integer
Dim Dir As IO.DirectoryInfo, Dirs As IO.DirectoryInfo()
Try
Dir = New IO.DirectoryInfo(Path)
Dirs = Dir.GetDirectories("*.*", IO.SearchOption.TopDirectoryOnly)
For Index = 0 To Dirs.Length - 1
DirList.Add(Dirs(Index).FullName)
Next
Return DirList
Catch ex As Exception
Return Nothing
End Try
End Function
Private Function ListFiles(Path As String) As List(Of String)
Dim FileList As New List(Of String)
Dim File As IO.DirectoryInfo, Files As IO.FileInfo()
Try
File = New IO.DirectoryInfo(Path)
Files = File.GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
FileList.AddRange(Files.Select(Function(Info) Info.Name))
Return FileList
Catch ex As Exception
Return Nothing
End Try
End Function
End Class