【问题标题】:How can I check access rights on a given directory?如何检查给定目录的访问权限?
【发布时间】:2011-09-17 21:41:37
【问题描述】:

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

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

非常感谢:)

【问题讨论】:

    标签: c# directory access-rights


    【解决方案1】:

    到目前为止,确保您有权访问文件系统对象的最简单方法是尝试访问它。如果它因访问被拒绝错误而失败,那么您没有访问权限。只需检测该错误情况并继续搜索下一项即可。

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

    【讨论】:

    • +1; @Jonathan:异常处理(try/catch)应保留用于异常情况,除非您使用的 API 没有其他选择。尽可能使用状态检查或Try 变体。不过,我在这里没有看到方便的(GetAccessControl?)。因此,您可能会遇到异常处理程序。但请确保您捕获UnauthorizedAccessException(或任何特定的异常被抛出)而不是基类Exception
    • @Merlyn 你关于try/catch 的观点是正确的,但它绝不应该超越行为的正确性。避免try/catch 并实现您自己的权限检查代码可能会让您对不使用异常来处理正常行为感到高兴,但是当您的程序表现不佳时,这并不令人安慰。另外,在我的回答中,我提到了检测错误而不是异常。好的文件处理 API 应该提供 TryXXX 变体。
    • 我完全同意。当你有一个现有的检查方法时,我的观点是站得住脚的,当你可以确信它可以捕捉到你感兴趣的情况时。如果你无法获得能够提供这种信心的代码,一个异常处理程序和一个注释说明你为什么要吞下异常肯定是有道理的。
    • @Merlyn 我一点也不反对你。有时您别无选择,只能使用异常进行正常的流控制。我的观点是,程序的正确行为应该覆盖对使用异常进行流控制的担忧。
    【解决方案2】:

    您可以通过将写入权限替换为读取权限来检查this 问题。此外,将您的代码包装在 try catch 块中,如果抛出异常,您可以假设(或正确检查异常类型以确保)无法遍历目录。

    【讨论】:

    • +1;很好的参考。但是,这很困难,因为他们推荐的方法似乎标记为Obsolete (SecurityManager.IsGranted)。另请参阅大卫关于异常处理的回答下的 cmets - 你没看错:)
    • 是的——我有很强的 Python 背景,你可能知道“请求宽恕而不是许可”的想法 :) 所以捕获错误通常成为流程的一部分——当然,如果有 TrySomething 方法它们在 .NET 中总是更好,并且不推荐对 Catch 异常进行测试。
    猜你喜欢
    • 2023-03-29
    • 2010-09-25
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多