如何检查应用程序是否可以访问目录?

时间:2013-03-27 09:59:59

标签: c# .net

在我的应用程序中,我需要检查是否有权写入文件夹。我使用以下方法:

public bool IsAvailable(string path)
        {
            bool hasPermissions = false;

            if (Directory.Exists(path))
            {
                var permission = new FileIOPermission(FileIOPermissionAccess.Write, path);
                try
                {
                    permission.Demand();
                    hasPermissions = true;
                }
                catch(SecurityException e)
                {
                    hasPermissions = false;
                }
            }

            return hasPermissions;
        }

当我给它一个文件夹的路径,我知道肯定没有人可以访问它(我已经删除了文件夹属性的安全选项卡中所有用户的所有权限),它不会抛出任何异常。它只是沿着try块继续。

任何想法为什么或如何做到这一点检查更好?

我在其他问题上找到的AppDomain.PermissionSet属性相关答案没有成功。

提前谢谢。

3 个答案:

答案 0 :(得分:3)

我使用了以下方法来完成它:

public static bool HasWritePermissionOnDir(string path)
    {
        var writeAllow = false;
        var writeDeny = false;
        var accessControlList = Directory.GetAccessControl(path);
        if (accessControlList == null)
            return false;
        var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
        if (accessRules == null)
            return false;

        foreach (FileSystemAccessRule rule in accessRules)
        {
            if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) continue;

            if (rule.AccessControlType == AccessControlType.Allow)
                writeAllow = true;
            else if (rule.AccessControlType == AccessControlType.Deny)
                writeDeny = true;
        }

        return writeAllow && !writeDeny;
    }

请告诉我它是否对您有所帮助,如果是的话也要标记

答案 1 :(得分:2)

这种方法(询问是否可访问,然后做某事)容易出现竞争条件。在您的检查和对该目录中内容的实际访问之间,权限可能会发生变化。

最好只是尝试在该目录中读取/写入内容,并捕获潜在的异常。

所以不要

if(IsAvailable(path)) {
    try {
        doSomething();
    } catch (...) {
    }
}

而是

try {
    doSomething();
} catch (...) {
}

Grace Hopper引用:

  

“请求宽恕总是比获得许可更容易。”

答案 2 :(得分:0)

var permissionSet = new PermissionSet(PermissionState.None);    
var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename);
permissionSet.AddPermission(writePermission);

if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
{}