文件stat()vs access()来检查目录的权限

Bam*_*rza 8 c++ file-io stat

我已成功使用两个stat()&access()单独确定用户是否具有对目录的读取或读/写访问权限.

我的问题是: - 有一个首选的方法吗?我看到很多使用的例子stat,但就我的目的而言,访问似乎更轻量级并且有用.
- 是否有任何问题(例如 - 安全性)与其中一个? - 我的方法有什么问题吗?

这是一些伪代码(从内存重新创建w/o编译):

       // Using access():
    bool readAccessPermission = false; 
    bool writeAccessPermission = false;

    if (mode == 'r'){
            if (access(directory, R_OK) == 0)
                    readAccessPermission = true;                        
    }
    else{
            if (access(directory, R_OK && W_OK) == 0)
                    readAccessPermission = true;
                    writeAccessPermission = true;
    }


    // vs. using stat function
    // assume I already called stat(directory) and have the object


    bool readAccessPermission = false; 
    bool writeAccessPermission = false;

    var retmode = ((stats.mode) & (0777));

    if (modeString == 'r'){ 
        if ((retmode) & (consts.S_IRUSR)){
            readAccessPermission = false; 
        }    
    } 
    else{ 
        if ((retmode) & (consts.S_IRUSR)){
            readAccessPermission = true; 

            if ((retmode) & consts.S_IWUSR)){               
                writeAccessPermission = true; 
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ada*_*wes 8

两者都等同于您的需求.access()如果你不打算对你填充的stat结构做任何事情,那么它是一个更干净的包装器.

请记住,在这样做时你正在创造一场比赛.权限可以在调用之间stat()/access()以及实际尝试使用目录时更改.地狱,甚至可以删除该目录并在那段时间重新创建.

最好只是尝试打开你需要的东西并检查EPERM.检查stat()access()不保证后续操作不会返回EPERM.


dme*_*ter 5

在简单的情况下,对于我们的问题来说,两者在功能上是等效的。此外,access()不会更快,因为要获取相同的数据结构(索引节点)。

但是,如果系统上使用了访问控制列表 ( ACL ),则 access 将处理这些列表,而您无法使用数据检查 ACL stat