如何检查应用程序是否可以访问目录?
在我的应用程序中,我需要检查是否有权写入文件夹。 我使用以下方法:
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)) {}