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 — Obtém permissões de arquivo
filename
Caminho para o arquivo.
Retorna as permissões do arquivo em modo numérico. Os bits menos significativos deste modo
são os mesmos das permissões esperadas por chmod(),
entretanto na maioria das plataformas o valor de retorno também inclui informação sobre
o tipo do arquivo informado em filename
. Os exemplo
abaixo demonstram como testar o valor de retorno para permissões e tipos de arquivos
específicos em sistemas POSIX, incluindo Linux e macOS.
Para aquivos locais, o valor de retorno específico é o do membro
st_mode
da estrutura retornada pela função
stat() da biblioteca C. Exatamenta quais bits são definidos
pode variar de plataforma para plataforma, e é recomendado consultar a documentação
específica da plataforma se for necessária uma interpretação dos bits de não-permissão
do valor de retorno.
Retorna false
em caso de falha.
Em caso de falha, um E_WARNING
será emitido.
Exemplo #1 Mostra as permissões como um valor em octal
<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>
O exemplo acima produzirá:
1777 0644
Exemplo #2 Mostra as permissões completas
<?php
$perms = fileperms('/etc/passwd');
switch ($perms & 0xF000) {
case 0xC000: // socket
$info = 's';
break;
case 0xA000: // ligação simbólica
$info = 'l';
break;
case 0x8000: // regular
$info = 'r';
break;
case 0x6000: // bloco special
$info = 'b';
break;
case 0x4000: // diretório
$info = 'd';
break;
case 0x2000: // caractere especial
$info = 'c';
break;
case 0x1000: // tubo FIFO
$info = 'p';
break;
default: // desconhecido
$info = 'u';
}
// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
echo $info;
?>
O exemplo acima produzirá:
-rw-r--r--
Nota: Os resultados desta função são armazenados em cache. Consulte a função clearstatcache() para mais detalhes.
A partir do PHP 5.0.0, esta função também pode ser usada com alguns empacotadores de URL. Consulte os Protocolos e empacotadores suportados para determinar quais empacotadores suportam a família de funções 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)