【问题标题】:File explorer - UnauthorizedAccessException文件资源管理器 - UnauthorizedAccessException
【发布时间】: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())

.

如果我以管理员身份启动程序,它就可以工作。但是我可以在没有管理员身份的情况下避免/解决这个问题吗?

【问题讨论】:

  • 您在这里指的是什么“问题”?是避免异常的问题,还是在没有管理权限的情况下看不到某些驱动器/文件夹的问题?
  • 很高兴看到没有管理员权限的所有文件夹,但我认为这不起作用?所以,避免异常是可以的:)

标签: c# .net wpf xaml


【解决方案1】:

您的问题较早出现:foreach (DirectoryInfo DR in DIR.GetDirectories())
C:\ 包含只有管理员权限才能访问的文件夹。 您尝试获取此类文件夹的信息,但程序抛出异常,因为您无权获取此类信息。

可能的解决方法如下所示:

try
{
    foreach (DirectoryInfo DR in DIR.GetDirectories())
    {
        // stuff
    }
}
catch(exception ex)
{
    //do something with the failure. maybe ignore it
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2015-09-10
    • 2021-07-26
    相关资源
    最近更新 更多