2011-09-17 42 views
0

目前我有一个程序可以搜索音乐文件的用户设置目录和子目录,并将它们添加到集合中。但是,如果它所涉及的目录之一受到保护,那么程序就会崩溃。我想知道如何检查用户是否有权访问目录,然后再尝试搜索以避免此问题。 下面是我用于搜索的代码,它目前包含了一个关于“系统卷信息”的基本工作,但由于可能存在其他受保护的目录,我希望将其更改为包含它们。如何检查给定目录的访问权限?

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); 
         } 
        } 
       } 
      } 
     } 
    } 

非常感谢:)

回答

2

到目前为止,以确保您可以访问文件系统对象的最简单的方法是试图访问它。如果它失败并出现拒绝访问错误,那么您无权访问。只要检测到错误情况并继续搜索下一个项目。

换句话说,委托人检查对系统的访问权,毕竟是访问权的最终仲裁者。

+0

+1; @Jonathan:异常处理('try' /'catch')应该保留用于特殊情况,除非您使用的API不提供其他选项。尽可能使用状态检查或“尝试”变体。虽然('GetAccessControl'),我在这里看不到方便的一个。所以你可能会被一个异常处理程序困住。但要确保你捕获'UnauthorizedAccessException'(或者引发任何特定的异常),而不是基类'Exception'类。 –

+1

@Merlyn你关于'try/catch'的观点是有效的,但它绝对不应该覆盖behvaiour的正确性。避免使用'try/catch'并实现你自己的权限检查代码可能会让你很高兴不使用正常行为的异常,但是当你的程序表现不佳时,这并不是一种安慰。另外,在我的回答中,我提到检测错误而不是例外。良好的文件处理API应该提供TryXXX变体。 –

+0

我完全同意。当你有一个现有的检查方法,并且你可以确信它捕获了你感兴趣的案例时,我的观点就会成立。如果你不能得到足够的信任的代码,一个异常处理器加上一个注释说明为什么你吞咽异常肯定是为了。 –

1

您可以通过替换写入读取权限来检查this问题。另外,将代码封装在try catch块中,并且如果引发异常,则可以假设(或者正确检查异常类型以确保该目录不能被遍历)。

+0

+1;很好的参考。但是,这很困难,因为他们推荐的方法似乎被标记为“Obsolete”('SecurityManager.IsGranted')。另请参阅David关于异常处理的回答下的注释 - 你没有错:) –

+0

正确 - 我有一个强大的Python背景,你可能知道'请求原谅而不是权限'的想法:)所以捕捉错误通常成为的流程 - 当然,如果有TrySomething方法,它们在.NET中总是更好,然后对Catch异常进行测试并不是推荐的方法/最佳实践。 – leon