我正在使用下面的代码来获取目录的文件和子目录,然后填充TreeView控件。我收到UnauthorizedAccessException异常。我尝试使用try-catch来处理它,但徒劳无益...
void GetFilesAndSubDirs(DirectoryInfo root, TreeNodeCollection nodes)
{
FileInfo[] files = null;
DirectoryInfo[] subDirs = null;
try
{
files = root.GetFiles("*.*");
subDirs = root.GetDirectories();
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show(e.Message);
}
catch (DirectoryNotFoundException e)
{
MessageBox.Show(e.Message);
}
TreeNode parent = FindNode(root.Name, nodes);
if (files != null)
{
foreach (FileInfo fiInfo in files)
{
TreeNode fileNode = new TreeNode(fiInfo.Name);
fileNode.ImageIndex = 1;
fileNode.SelectedImageIndex = 1;
parent.Nodes.Add(fileNode);
}
}
if (subDirs != null)
{
foreach (DirectoryInfo dirInfo in subDirs)
{
TreeNode dirNode = new TreeNode(dirInfo.Name);
dirNode.ImageIndex = 0;
dirNode.SelectedImageIndex = 0;
parent.Nodes.Add(dirNode);
GetFilesAndSubDirs(dirInfo, parent.Nodes);
}
}
}
更新
当我评论递归调用的行时,它很好用。
这是预期的行为还是您应该有权访问此目录?
您是否曾尝试以管理员身份运行Visual Studio?您作为用户可能有权查看它,但该应用程序不一定要查看它。
尽管答案和评论在一定程度上是正确的。他们没有处理当前的问题;您“试图捉住但徒劳”-当然是徒劳的-您做到了。
首先,您尝试获取名为root的目录-您将获得异常,并仍然尝试继续使用相同的“ root”变量,该变量将为null或至少未正确设置。
[当您收到错误消息时(由于某种原因,仅将该消息与用户联系起来),您应该停止该过程。您有一个exception(这绝对是停止处理的原因-这是一个意外错误)-您将无法在异常将按预期方式运行后承担该过程。
我建议您(在这种情况下)显示消息框并“返回”,不要继续进行此过程。
尽管它不是神圣或神圣的,但我建议您阅读“防御性编程(C#)”
编辑#1
沿着此行更改方法的开头:
void GetFilesAndSubDirs(DirectoryInfo root, TreeNodeCollection nodes)
{
FileInfo[] files = null;
DirectoryInfo[] subDirs = null;
try
{
files = root.GetFiles("*.*");
subDirs = root.GetDirectories();
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show(e.Message);
return; // unexpected behavior : notice to user and stop
}
catch (DirectoryNotFoundException e)
{
MessageBox.Show(e.Message);
return; // unexpected behavior : notice to user and stop
}