2

所以我关注了 MS 文章http://msdn.microsoft.com/en-us/library/ms171645.aspx

这是使用设计器创建具有 ListView 和 TreeView 控件的资源管理器样式界面。

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

VS 2010 指出这就是问题所在。

subSubDirs = subDir.GetDirectories();

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

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

4

2 回答 2

0

您可能将 try catch 放在错误的位置。根据演练中的代码,您可以像这样放置 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)
于 2012-01-30T21:29:03.810 回答
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 获取文件和目录信息。

于 2012-01-30T21:39:45.767 回答