Click to See Complete Forum and Search --> : VB.NET 2005 General : How do I make my own Windows Explorer Application?


HanneSThEGreaT
March 15th, 2007, 06:07 AM
Q: How do I list All Folders & SubFolders in a Treeview?

A: Import the IO Namespace. Add the following Above your form's Class declaration:
Imports System.IO
Add the Following Sub under the Private Class statement.
Private Sub AddAllFolders(ByVal TNode As TreeNode, ByVal FolderPath As String)
Try
For Each FolderNode As String In Directory.GetDirectories(FolderPath)
Dim SubFolderNode As TreeNode = TNode.Nodes.Add(FolderNode.Substring(FolderNode.LastIndexOf("\"c) + 1))

SubFolderNode.Tag = FolderNode

SubFolderNode.Nodes.Add("Loading...")
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

In Form Load, or any other event, call the above created sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim Tnode As TreeNode = TreeView1.Nodes.Add("(Drive C:)")
AddAllFolders(Tnode, "C:\")
End Sub
In the Treeview_AfterSelect event, enable the capability to show the sub folders, again, by calling the AddAllFolders Sub :
Private Sub Treeview1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect
If TreeView1.SelectedNode.Nodes.Count = 1 AndAlso TreeView1.SelectedNode.Nodes(0).Text = "Loading..." Then

TreeView1.SelectedNode.Nodes.Clear()

AddAllFolders(TreeView1.SelectedNode, CStr(TreeView1.SelectedNode.Tag))

End If
End Sub

Do the same with the Treeview_BeforeExpand event :
Private Sub Treeview1_BeforeExpand(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand

If e.Node.Nodes.Count = 1 AndAlso e.Node.Nodes(0).Text = "Loading..." Then

e.Node.Nodes.Clear()
AddAllFolders(e.Node, CStr(e.Node.Tag))

End If

End Sub

If you were to run this code now, your Treeview will show all the Folders and all the Subfolders within each folder, and all Sub folders within those etc..

Q: How do I list all the files within each folder also in the Treeview?

A: To list all the folders' files as well, simply add the following to the Treeview_AfterSelect event. Add this under the already existing If/End If structure:
Dim folder As String = CStr(e.Node.Tag)

If Not folder Is Nothing AndAlso IO.Directory.Exists(folder) Then
Try
For Each file As String In IO.Directory.GetFiles(folder)
e.Node.Nodes.Add(file.Substring(file.LastIndexOf("\"c) + 1))

Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
When a node is selected, the file names will also appear as sub nodes under the current selected node.

Q: What if I don't want the Filenames to appear in the Treeview, but in a ListView instead, what to do then?

A: Add a ListView to your form, and name it. (with this FAQ, I kept the default names)
Remove the previous code (the code that added the Files) from the TreeView_AfterSelect event.
In Form_Load, add the following code, in order for us to have columns in our ListView:
ListView1.View = View.Details
' Add a column with width 80 and left alignment
ListView1.Columns.Add("File Name", 150, HorizontalAlignment.Left)
ListView1.Columns.Add("File Type", 80, HorizontalAlignment.Left)
ListView1.Columns.Add("Date Modified", 150, HorizontalAlignment.Left)

Add the above code just underneath the already existing code, i.e, just above End Sub

Add the following code to the TreeView_AfterSelect event, to show the Folders' contents in the ListView. The code is almost exactly the same as our previous code in this event (The code to load the files into the Treeview)
Dim folder As String = CStr(TreeView1.SelectedNode.Tag)

If Not folder Is Nothing AndAlso IO.Directory.Exists(folder) Then
Try
For Each file As String In IO.Directory.GetFiles(folder)
ListView1.Items.Add(file.Substring(file.LastIndexOf("\"c) + 1), file.ToString())
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
This will load all the files in the selected folder (selected node) into the ListView

Q: How do I add File Details such as The File Extension, and the Last Modified Date in the ListView?

A: In the TreeView_AfterSelect event, declare the following 3(three) variables, just underneath the Private Sub statement:
Dim FileExtension As String
Dim SubItemIndex As Integer
Dim DateMod As String
In The Try catch block, just underneath the For Each block, add the following, to get the File Extension, and get the Last Modified date:
FileExtension = IO.Path.GetExtension(file)
DateMod = IO.File.GetLastWriteTime(file).ToString()
Just after the statement where we added the File Name to the ListView, add these as well:
ListView1.Items(SubItemIndex).SubItems.Add(FileExtension.ToString() & " File")
ListView1.Items(SubItemIndex).SubItems.Add(DateMod.ToString())
SubItemIndex += 1
When run, this will display all the selected Folder's files with their File Extensions, and Last Modified Dates.

Q: How would I display the Associated File Icons too, in the ListView?

A: Add an ImageList to your form (Found in All Windows Forms tab of the Toolbox), keep the default name
Set the SmallImageList property of the ListView, to the name of your ImageList (ImageList1, in my case)
Add the Following Import to our code, because we are going to use APIs (http://www.codeguru.com/vb/gen/vb_general/ideincludingvisualstudionet/article.php/c11981/) to retrieve this information :
Imports System.Runtime.InteropServices
Add the Following structure, API function and API cconstants, just above our AddAllFolder sub:
Private Structure SHFILEINFO
Public hIcon As IntPtr ' : icon
Public iIcon As Integer ' : icondex
Public dwAttributes As Integer ' : SFGAO_ flags
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure

Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" _
(ByVal pszPath As String, _
ByVal dwFileAttributes As Integer, _
ByRef psfi As SHFILEINFO, _
ByVal cbFileInfo As Integer, _
ByVal uFlags As Integer) As IntPtr

Private Const SHGFI_ICON = &H100
Private Const SHGFI_SMALLICON = &H1
Private Const SHGFI_LARGEICON = &H0 ' Large icon
Private Const MAX_PATH = 260

Add our own sub to extract the File Icons, and store the found icon into the ImageList:
Private Sub AddImages(ByVal strFileName As String)

Dim shInfo As SHFILEINFO
shInfo = New SHFILEINFO()
shInfo.szDisplayName = New String(vbNullChar, MAX_PATH)
shInfo.szTypeName = New String(vbNullChar, 80)
Dim hIcon As IntPtr
hIcon = SHGetFileInfo(strFileName, 0, shInfo, Marshal.SizeOf(shInfo), SHGFI_ICON Or SHGFI_SMALLICON)
Dim MyIcon As Drawing.Bitmap
MyIcon = Drawing.Icon.FromHandle(shInfo.hIcon).ToBitmap
ImageList1.Images.Add(strFileName.ToString(), MyIcon)

End Sub

Add the Call to the AddImages function, in the TreeView_AfterSelect event, just underneath DateMod = IO.File.GetLastWriteTime(file).ToString()

When run, After a Folder is selected, you will see all files, with their Associated File Icons, and the previous details in the ListView

Q: How do I clear the Old Items from a Listview?

A: Simply add the following statement in the Treeview_AfterSelect event, just underneath Dim DateMod As String
ListView1.Items.Clear()

Q: How do I Sort the Treeview, in order to show all items in the Treeview alphabetically

A:Simply add the following statement in Form_Load
TreeView1.Sort()

A sample is also attached in this FAQ