191 lines
5.1 KiB
C#
191 lines
5.1 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
namespace WpfTreeView
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for MainWindow.xaml
|
|
/// </summary>
|
|
public partial class MainWindow : Window
|
|
{
|
|
#region Constructor
|
|
|
|
/// <summary>
|
|
/// Default constructor
|
|
/// </summary>
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region On Loaded
|
|
|
|
/// <summary>
|
|
/// When the application first opens
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void Window_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
// Get every logical drive on the machine
|
|
foreach (var drive in Directory.GetLogicalDrives())
|
|
{
|
|
// Create a new item for it
|
|
var item = new TreeViewItem()
|
|
{
|
|
// Set the header
|
|
Header = drive,
|
|
// And the full path
|
|
Tag = drive
|
|
};
|
|
|
|
// Add a dummy item
|
|
item.Items.Add(null);
|
|
|
|
// Listen out for item being expanded
|
|
item.Expanded += Folder_Expanded;
|
|
|
|
// Add it to the main tree-view
|
|
FolderView.Items.Add(item);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Folder Expanded
|
|
|
|
/// <summary>
|
|
/// When a folder is expanded, find the sub folders/files
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
private void Folder_Expanded(object sender, RoutedEventArgs e)
|
|
{
|
|
#region Initial Checks
|
|
|
|
var item = (TreeViewItem)sender;
|
|
|
|
// If the item only contains the dummy data
|
|
if (item.Items.Count != 1 || item.Items[0] != null)
|
|
return;
|
|
|
|
// Clear dummy data
|
|
item.Items.Clear();
|
|
|
|
// Get full path
|
|
var fullPath = (string)item.Tag;
|
|
|
|
#endregion
|
|
|
|
#region Get Folders
|
|
|
|
// Create a blank list for directories
|
|
var directories = new List<string>();
|
|
|
|
// Try and get directories from the folder
|
|
// ignoring any issues doing so
|
|
try
|
|
{
|
|
var dirs = Directory.GetDirectories(fullPath);
|
|
|
|
if (dirs.Length > 0)
|
|
directories.AddRange(dirs);
|
|
}
|
|
catch { }
|
|
|
|
// For each directory...
|
|
directories.ForEach(directoryPath =>
|
|
{
|
|
// Create directory item
|
|
var subItem = new TreeViewItem()
|
|
{
|
|
// Set header as folder name
|
|
Header = GetFileFolderName(directoryPath),
|
|
// And tag as full path
|
|
Tag = directoryPath
|
|
};
|
|
|
|
// Add dummy item so we can expand folder
|
|
subItem.Items.Add(null);
|
|
|
|
// Handle expanding
|
|
subItem.Expanded += Folder_Expanded;
|
|
|
|
// Add this item to the parent
|
|
item.Items.Add(subItem);
|
|
});
|
|
|
|
#endregion
|
|
|
|
#region Get Files
|
|
|
|
// Create a blank list for files
|
|
var files = new List<string>();
|
|
|
|
// Try and get files from the folder
|
|
// ignoring any issues doing so
|
|
try
|
|
{
|
|
var fs = Directory.GetFiles(fullPath);
|
|
|
|
if (fs.Length > 0)
|
|
files.AddRange(fs);
|
|
}
|
|
catch { }
|
|
|
|
// For each file...
|
|
files.ForEach(filePath =>
|
|
{
|
|
// Create file item
|
|
var subItem = new TreeViewItem()
|
|
{
|
|
// Set header as file name
|
|
Header = GetFileFolderName(filePath),
|
|
// And tag as full path
|
|
Tag = filePath
|
|
};
|
|
|
|
// Add this item to the parent
|
|
item.Items.Add(subItem);
|
|
});
|
|
|
|
#endregion
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Helpers
|
|
|
|
/// <summary>
|
|
/// Find the file or folder name from a full path
|
|
/// </summary>
|
|
/// <param name="path">The full path</param>
|
|
/// <returns></returns>
|
|
public static string GetFileFolderName(string path)
|
|
{
|
|
// If we have no path, return empty
|
|
if (string.IsNullOrEmpty(path))
|
|
return string.Empty;
|
|
|
|
// Make all slashes back slashes
|
|
var normalizedPath = path.Replace('/', '\\');
|
|
|
|
// Find the last backslash in the path
|
|
var lastIndex = normalizedPath.LastIndexOf('\\');
|
|
|
|
// If we don't find a backslash, return the path itself
|
|
if (lastIndex <= 0)
|
|
return path;
|
|
|
|
// Return the name after the last back slash
|
|
return path.Substring(lastIndex + 1);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|