【发布时间】:2014-06-04 12:25:42
【问题描述】:
我发现这个简单的File Explorer 用于锐角上的 WPF。
namespace WindowsExplorer
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.cmbDrive.ItemsSource = DriveInfo.GetDrives().Where(dr => dr.IsReady == true).ToList();
this.cmbDrive.DisplayMemberPath = "Name";
this.cmbDrive.SelectedValuePath = "Name";
}
private void cmbDrive_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.tvwDirectory.Items.Clear();
DirectoryInfo DIR = new DirectoryInfo(this.cmbDrive.SelectedValue.ToString());
foreach (DirectoryInfo DR in DIR.GetDirectories())
{
MyTreeViewItem TVI = new MyTreeViewItem();
TVI.Header = DR.Name;
TVI.Path = DR.FullName;
TVI.Type = DR.GetType().Name;
TVI.Expanded += new RoutedEventHandler(CTVI_Expanded);
if (!DR.Attributes.ToString().Contains("Hidden"))
{
foreach (DirectoryInfo CDIR in DR.GetDirectories())
{
MyTreeViewItem CTVI = new MyTreeViewItem();
CTVI.Expanded += new RoutedEventHandler(CTVI_Expanded);
CTVI.Header = CDIR.Name;
CTVI.Path = CDIR.FullName;
CTVI.Type = CDIR.GetType().Name;
TVI.Items.Add(CTVI);
}
this.tvwDirectory.Items.Add(TVI);
}
}
foreach (FileInfo FL in DIR.GetFiles())
{
this.ltbExplorer.Items.Add(FL.Name);
}
}
void CTVI_Expanded(object sender, RoutedEventArgs e)
{
MyTreeViewItem TVI = (MyTreeViewItem)sender;
foreach (MyTreeViewItem CTVI in TVI.Items)
{
if (CTVI.Type == "DirectoryInfo")
{
DirectoryInfo DIR = new DirectoryInfo(CTVI.Path);
foreach (DirectoryInfo CDIR in DIR.GetDirectories())
{
MyTreeViewItem CTVI1 = new MyTreeViewItem();
CTVI1.Expanded += new RoutedEventHandler(CTVI_Expanded);
CTVI1.Header = CDIR.Name;
CTVI1.Path = CDIR.FullName;
CTVI1.Type = CDIR.GetType().Name;
if (CTVI.Items.Contains(CTVI1.Header) == false)
CTVI.Items.Add(CTVI1);
}
}
}
e.Handled = true;
}
private void tvwDirectory_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (e.NewValue != null)
{
this.ltbExplorer.Items.Clear();
MyTreeViewItem TVI = (MyTreeViewItem)e.NewValue;
DirectoryInfo DIR = new DirectoryInfo(TVI.Path);
foreach (FileInfo FL in DIR.GetFiles())
{
ltbExplorer.Items.Add(FL.Name);
}
}
e.Handled = true;
}
}
}
namespace WindowsExplorer
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.cmbDrive.ItemsSource = DriveInfo.GetDrives().Where(dr => dr.IsReady == true).ToList();
this.cmbDrive.DisplayMemberPath = "Name";
this.cmbDrive.SelectedValuePath = "Name";
}
private void cmbDrive_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.tvwDirectory.Items.Clear();
DirectoryInfo DIR = new DirectoryInfo(this.cmbDrive.SelectedValue.ToString());
foreach (DirectoryInfo DR in DIR.GetDirectories())
{
MyTreeViewItem TVI = new MyTreeViewItem();
TVI.Header = DR.Name;
TVI.Path = DR.FullName;
TVI.Type = DR.GetType().Name;
TVI.Expanded += new RoutedEventHandler(CTVI_Expanded);
if (!DR.Attributes.ToString().Contains("Hidden"))
{
foreach (DirectoryInfo CDIR in DR.GetDirectories())
{
MyTreeViewItem CTVI = new MyTreeViewItem();
CTVI.Expanded += new RoutedEventHandler(CTVI_Expanded);
CTVI.Header = CDIR.Name;
CTVI.Path = CDIR.FullName;
CTVI.Type = CDIR.GetType().Name;
TVI.Items.Add(CTVI);
}
this.tvwDirectory.Items.Add(TVI);
}
}
foreach (FileInfo FL in DIR.GetFiles())
{
this.ltbExplorer.Items.Add(FL.Name);
}
}
void CTVI_Expanded(object sender, RoutedEventArgs e)
{
MyTreeViewItem TVI = (MyTreeViewItem)sender;
foreach (MyTreeViewItem CTVI in TVI.Items)
{
if (CTVI.Type == "DirectoryInfo")
{
DirectoryInfo DIR = new DirectoryInfo(CTVI.Path);
foreach (DirectoryInfo CDIR in DIR.GetDirectories())
{
MyTreeViewItem CTVI1 = new MyTreeViewItem();
CTVI1.Expanded += new RoutedEventHandler(CTVI_Expanded);
CTVI1.Header = CDIR.Name;
CTVI1.Path = CDIR.FullName;
CTVI1.Type = CDIR.GetType().Name;
if (CTVI.Items.Contains(CTVI1.Header) == false)
CTVI.Items.Add(CTVI1);
}
}
}
e.Handled = true;
}
private void tvwDirectory_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (e.NewValue != null)
{
this.ltbExplorer.Items.Clear();
MyTreeViewItem TVI = (MyTreeViewItem)e.NewValue;
DirectoryInfo DIR = new DirectoryInfo(TVI.Path);
foreach (FileInfo FL in DIR.GetFiles())
{
//MyTreeViewItem CTVI2 = new MyTreeViewItem();
//CTVI2.Expanded += new RoutedEventHandler(CTVI_Expanded);
//CTVI2.Header = FL.Name;
//CTVI2.Path = FL.FullName;
//CTVI2.Type = FL.GetType().Name;
ltbExplorer.Items.Add(FL.Name);
}
}
e.Handled = true;
}
}
}
.
该程序有效。但是,如果我点击驱动器 C:例如,我会收到此错误:
System.UnauthorizedAccessException was unhandled
.
它涉及第一个 foreach:
foreach (DirectoryInfo CDIR in DR.GetDirectories())
.
如果我以管理员身份启动程序,它就可以工作。但是我可以在没有管理员身份的情况下避免/解决这个问题吗?
【问题讨论】:
-
您在这里指的是什么“问题”?是避免异常的问题,还是在没有管理权限的情况下看不到某些驱动器/文件夹的问题?
-
很高兴看到没有管理员权限的所有文件夹,但我认为这不起作用?所以,避免异常是可以的:)