C#treeview未经授权的例外

时间:2012-01-30 21:14:30

标签: c# exception-handling file-permissions getdirectories

所以我跟着MS文章http://msdn.microsoft.com/en-us/library/ms171645.aspx

这是使用Designer使用ListView和TreeView控件创建资源管理器样式界面。

所以一切顺利,你是否将它设置为C的根目录以扫描所有文件夹和文件等。我收到{"Access to the path '<path to file' is denied."}

VS 2010指出了这个问题。

subSubDirs = subDir.GetDirectories();

我可以尝试一下这个,但是,在抛出异常后应用程序不会继续。

有没有办法可以跳过应用无法访问的目录?

2 个答案:

答案 0 :(得分:0)

你可能在错误的地方尝试捕获。根据演练中的代码,您可以将try catch设置为:

替换:

subSubDirs = subDir.GetDirectories();

用这个:

try 
{
    subSubDirs = subDir.GetDirectories();
}
catch(UnauthorizedAccessException uae)
{
  //log that subDir.GetDirectories was not possible
}

另外,该行:

if (subSubDirs.Length != 0)

应更改为:

if (subSubDirs != null && subSubDirs.Length != 0)

答案 1 :(得分:0)

您收到例外,因为主叫帐户没有System Volume Information等文件夹的访问权限。您可以使用Linq并跳过标记为SystemHidden的文件夹来解决此部分

DirectoryInfo root = new DirectoryInfo(@"C:\");

Func<FileSystemInfo, Boolean> predicate = dir =>
    (dir.Attributes & FileAttributes.System) != FileAttributes.System &&
    (dir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden;

IEnumerable<FileSystemInfo> directories = root.GetDirectories().Where(predicate);

foreach (DirectoryInfo directory in directories) {
    try {
        Trace.WriteLine(directory.Name);
        DirectoryInfo[] subdirectories = directory.GetDirectories();
    }
    catch (System.UnauthorizedAccessException) {
        Trace.WriteLine("Insufficient access rights.");
    }
}

Trace.WriteLine("End of application.");

但这并不适用于所有方案,并且在某些文件和文件夹上失败。使用现有的API没有简单的解决方案;您可能希望通过WMI来查看获取文件和目录信息。