如何检查 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.PermissionSetApplication.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 文件是不是可读/可写?的主要内容,如果未能解决你的问题,请参考以下文章

python学习二十一天文件可读,可写,可执行的操作

文件的高级应用

2019 08 08 文件高级应用和函数基础

linux可读可写权限

文件操作

文件的高级应用及修改的两种方式