13

可能重复:
.NET - 检查目录是否可访问而不进行异常处理

我使用 NET 3.5 和 C# 在 Visual Studio 2010 中制作了一个小文件浏览器,并且我有这个功能来检查目录是否可访问:

RealPath=@"c:\System Volume Information";
public bool IsAccessible()
{
    //get directory info
    DirectoryInfo realpath = new DirectoryInfo(RealPath);
    try
    {
        //if GetDirectories works then is accessible
        realpath.GetDirectories();                
        return true;
    }
    catch (Exception)
    {
        //if exception is not accesible
        return false;
    }
}

但我认为对于大目录,尝试获取所有子目录以检查目录是否可访问可能会很慢。我在尝试浏览受保护的文件夹或没有光盘的 cd/dvd 驱动器时使用此功能来防止错误(“设备未就绪”错误)。

是否有更好的方法(更快)来检查应用程序是否可以访问目录(最好在 NET 3.5 中)?

4

2 回答 2

14

根据MSDNDirectory.Exists如果您没有对该目录的读取权限,则应返回 false 。但是,您可以使用Directory.GetAccessControl它。例子:

public static bool CanRead(string path)
{
    try
    {
        var readAllow = false;
        var readDeny = false;
        var accessControlList = Directory.GetAccessControl(path);
        if(accessControlList == null)
            return false;

        //get the access rules that pertain to a valid SID/NTAccount.
        var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
        if(accessRules ==null)
           return false;

        //we want to go over these rules to ensure a valid SID has access
        foreach (FileSystemAccessRule rule in accessRules)
        {
            if ((FileSystemRights.Read & rule.FileSystemRights) != FileSystemRights.Read) continue;

            if (rule.AccessControlType == AccessControlType.Allow)
                readAllow = true;
            else if (rule.AccessControlType == AccessControlType.Deny)
                readDeny = true;
        }

        return readAllow && !readDeny;
    }
    catch(UnauthorizedAccessException ex)
    {
        return false;
    }
}

更新

正如一些评论中提到的,在外部域中的有效 SID 具有访问权限的情况下,这可能会返回不正确的值。为了检查当前用户是否具有访问权限,您需要以下内容:

foreach...

if (WindowsIdentity.GetCurrent().User.Value.equals(rule.IdentityReference.Value))

这将确认当前用户的 SID 是否与访问规则身份引用匹配,但也可能引发 SecurityException。

于 2012-07-29T14:52:15.927 回答
0

我认为您正在寻找该GetAccessControl方法,该System.IO.File.GetAccessControl方法返回一个 FileSecurity 对象,该对象封装了文件的访问控制。

于 2012-07-29T14:16:28.383 回答