fileperms返回的是十进制整数,但高位包含文件类型标志(如100表示普通文件),需用fileperms($path) & 0777提取纯权限值(如420对应0644),再进行位运算或chmod操作。
fileperms 返回的是十进制还是八进制?
fileperms 返回的是一个十进制整数,但它**代表的是底层 stat 结构中的 mode 字段**,包含文件类型(如 S_IFDIR、S_IFREG)和权限位(如 S_IRUSR)。它不是你 ls -l 看到的三位八进制数(如 0755),也不能直接用 decoct() 转成“习惯上的权限字符串”就完事——因为高位还混着文件类型标志。
常见错误:直接 echo decoct(fileperms('test.txt')) → 得到类似 100644,开头的 100 是文件类型(普通文件),后面 644 才是权限。不剥离类型位,后续按位操作会出错。
- 正确做法:用位与
&清除文件类型位,只保留权限部分:fileperms($path) & 0777 - 这样得到的就是纯权限值(如 420 对应 0644),可安全用于
chmod或比较 - 若要格式化显示为三位八进制字符串:
sprintf('%03o', fileperms($path) & 0777)
如何安全地“取当前权限 + 修改某几位”?
直接读取再加减权限(比如 + 0004)极易出错——权限位是位掩码,不是算术值。必须用位运算:保留原权限,再用 | 设置位、& ~ 清除位。
例如:给文件加上“组可执行”,但不改动其他任何权限:
立即学习“PHP免费学习笔记(深入)”;