目前我有一个程序可以搜索音乐文件的用户设置目录和子目录,并将它们添加到集合中。但是,如果它所涉及的目录之一受到保护,那么程序就会崩溃。我想知道如何检查用户是否有权访问目录,然后再尝试搜索以避免此问题。 下面是我用于搜索的代码,它目前包含了一个关于“系统卷信息”的基本工作,但由于可能存在其他受保护的目录,我希望将其更改为包含它们。如何检查给定目录的访问权限?
public void SearchForMusic()
{
//Searches selected directory and its sub directories for music files and adds their path to ObservableCollection<string> MusicFound
foreach (string ext in extentions)
{
foreach (string song in Directory.GetFiles(SearchDirectory, ext))
{
musicFound.Add(song);
}
foreach (string directory in Directory.GetDirectories(SearchDirectory))
{
if (directory.Contains("System Volume Information"))
{
}
else
{
foreach (string song in Directory.GetFiles(directory, ext))
{
musicFound.Add(song);
}
foreach (string subDirectory in Directory.GetDirectories(directory))
{
foreach (string subSong in Directory.GetFiles(subDirectory, ext))
{
musicFound.Add(subSong);
}
}
}
}
}
}
非常感谢:)
+1; @Jonathan:异常处理('try' /'catch')应该保留用于特殊情况,除非您使用的API不提供其他选项。尽可能使用状态检查或“尝试”变体。虽然('GetAccessControl'),我在这里看不到方便的一个。所以你可能会被一个异常处理程序困住。但要确保你捕获'UnauthorizedAccessException'(或者引发任何特定的异常),而不是基类'Exception'类。 –
@Merlyn你关于'try/catch'的观点是有效的,但它绝对不应该覆盖behvaiour的正确性。避免使用'try/catch'并实现你自己的权限检查代码可能会让你很高兴不使用正常行为的异常,但是当你的程序表现不佳时,这并不是一种安慰。另外,在我的回答中,我提到检测错误而不是例外。良好的文件处理API应该提供TryXXX变体。 –
我完全同意。当你有一个现有的检查方法,并且你可以确信它捕获了你感兴趣的案例时,我的观点就会成立。如果你不能得到足够的信任的代码,一个异常处理器加上一个注释说明为什么你吞咽异常肯定是为了。 –