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

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

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

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

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

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

先感谢您。

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

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

如果它对你有所帮助,请告诉我,如果是的话也请注明

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

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

所以不要

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

反而

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

Grace Hopper报价:

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

 var permissionSet = new PermissionSet(PermissionState.None); var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename); permissionSet.AddPermission(writePermission); if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet)) {}