如何检查 Windows 文件是不是可读/可写?
Posted
技术标签:
【中文标题】如何检查 Windows 文件是不是可读/可写?【英文标题】:How to check if a Windows file is readable/writable?如何检查 Windows 文件是否可读/可写? 【发布时间】:2011-02-28 01:08:49 【问题描述】:首先:我知道这对于实际检查我是否可以写作并不可靠。我正在编写一个文件传输客户端,并希望“远程”和“本地”文件浏览器窗格之间的功能奇偶校验。我完全理解我将不得不处理任何执行的任何操作的权限相关异常;这不是编程检查,它只是向用户显示。
我已经看到了几个发布这些示例的示例,但是我尝试过的所有方法要么无法理解,要么不起作用。我尝试了以下两种方法,但对于我绝对无法写入的内容(例如 C:\Windows 或 C:\Program Files 的内容)都只返回“是”:
System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, Path);
return System.Security.SecurityManager.IsGranted(fp);
和
System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, element.Path);
try
fp.Assert();
return true;
catch(Exception x)
return false;
(同样,我知道捕捉Exception
是可怕的,而使用try/catch 进行逻辑则稍微不那么可怕,我只是想让它工作)。
第一个告诉我 IsGranted
已弃用,我应该使用 AppDomain.PermissionSet
或 Application.PermissionSet
,但我找不到任何解释如何使用这些有意义的解释。我还看到我应该手动枚举所有 ACL 以自己弄清楚,但同样没有真正的例子。设置权限的例子很多,但检查它们的例子很少。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:好吧,这就是我最终得出的结论:
private readonly static WindowsIdentity _identity = WindowsIdentity.GetCurrent();
protected static bool GetPermission(FileSystemRights right, string path)
FileSecurity fs;
try
fs = System.IO.File.GetAccessControl(path);
catch(InvalidOperationException)
// called on a disk that's not present, ...
return false;
catch(UnauthorizedAccessException)
return false;
foreach(FileSystemAccessRule fsar in fs.GetAccessRules(true, true, typeof(SecurityIdentifier)))
if(fsar.IdentityReference == _identity.User && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow)
return true;
else if(_identity.Groups.Contains(fsar.IdentityReference) && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow)
return true;
return false;
当然,这并不理想,因为它忽略了拒绝权限。但我不知道应用各种 ACE 的顺序(我认为?)以找出“正确”的能力。尽管如此,拒绝规则还是比较少见的,所以它对我来说大部分时间都有效。
【讨论】:
以上是关于如何检查 Windows 文件是不是可读/可写?的主要内容,如果未能解决你的问题,请参考以下文章