Don't use substr, use bit operator
<?php
decoct(fileperms($file) & 0777); // return "755" for example
?>
If you want to compare permission
<?php
0755 === (fileperms($file) & 0777);
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
fileperms — Lee los permisos de un fichero
filename
Ruta de acceso al fichero.
Devuelve los permisos del fichero en formato numérico. Los bits de menor peso
son los mismos que los de los permisos en chmod(),
sin embargo algunas plataformas incluyen en el retorno información sobre
el tipo de fichero dado en filename
. Los ejemplos
siguientes muestran cómo probar el valor de retorno en cuanto a los
permisos y el tipo de fichero en sistemas POSIX como Linux o macOS.
Para ficheros locales, se utiliza el valor específico st_mode
de la estructura C devuelta por la función stat(). Los bits
afectados pueden cambiar según la plataforma y se debe investigar al respecto
si se deben analizar los bits que no concernen a la permisión.
Devuelve false
en caso de error.
En caso de fallo, se emite un E_WARNING
.
Ejemplo #1 Mostrar los permisos en valor octal
<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>
El resultado del ejemplo sería:
1777 0644
Ejemplo #2 Mostrar todos los permisos
<?php
$perms = fileperms('/etc/passwd');
switch ($perms & 0xF000) {
case 0xC000: // Socket
$info = 's';
break;
case 0xA000: // Enlace simbólico
$info = 'l';
break;
case 0x8000: // Regular
$info = 'r';
break;
case 0x6000: // Especial de bloque
$info = 'b';
break;
case 0x4000: // Directorio
$info = 'd';
break;
case 0x2000: // Especial de carácter
$info = 'c';
break;
case 0x1000: // Pipe FIFO
$info = 'p';
break;
default: // Desconocido
$info = 'u';
}
// Propietario
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// Grupo
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
// Todos
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
echo $info;
?>
El resultado del ejemplo sería:
-rw-r--r--
Nota: Los resultados de esta función son guardados en caché. Para más información ver clearstatcache().
Desde PHP 5.0.0, esta función también puede usarse con algunos URL wrappers. Consultar Protocolos y Envolturas soportados para deter4minar qué envolturas soportan la familia de funcionalidad de stat().
Don't use substr, use bit operator
<?php
decoct(fileperms($file) & 0777); // return "755" for example
?>
If you want to compare permission
<?php
0755 === (fileperms($file) & 0777);
?>
This may not be immediately apparent to some, but you can use octdec( $octal_value ) to match the permissions retrieved by file perms
<?php
//assumes file has 2770 permissions
$perm= fileperms( __FILE__ );
$bit = "102770";
printf( "%s\n", octdec( $bit ) );
printf( "%s\n", $perm);
?>
Do not forget: clearstatcache();
==============================
When ever you make a:
mkdir($dstdir, 0770 ))
or a:
chmod($dstdir, 0774 );
You have to call:
clearstatcache();
before you can call:
fileperms($dstdir);
Windows has a very different file permission model to Unix and integrates them only minimally.
Here's how Windows calculates the bitmask...
u+w/g+w/o+w is set based on whether the file has the read only flag.
u+r/g+w/o+w is always set.
u+x/g+x/o+x is set based on whether $filename is an inherently executable file (e.g. bat) or a directory.
Windows isn't integrating its ACLs at all.
Here's the source of all this: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions?view=vs-2019 (but it doesn't provide many details)