【发布时间】:2011-10-28 14:43:14
【问题描述】:
我已成功分别使用stat() 和access() 来确定用户是否具有对目录的读或读/写访问权限。
我的问题是:
- 有首选方法吗?我看到很多使用 stat 的示例,但就我的目的而言,访问似乎更轻量级并且服务于目的。
- 是否有任何问题(例如 - 安全性)w/一个或另一个?
- 我的方法有什么问题吗?
这是一些伪代码(从内存中重新创建,无需编译):
// 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;
}
}
}
【问题讨论】:
-
你的代码有点问题...
access(directory, R_OK && W_OK)应该是access(directory, R_OK|W_OK)。也没有理由计算(stats.mode) & (0777);你可以直接使用stats.mode。也就是说,这些方法之间在功能上没有区别。 -
如果您想要可移植代码的另一个问题:在 POSIX 下,您需要验证当前用户是否特别具有这些权限;您的测试仅检查目标的权限,而不检查它是否适用于当前用户。