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 — Lit les droits d'un fichier
filename
Chemin vers le fichier.
Retourne les permissions du fichier sous forme numérique. Les bits de poids
faible sont les mêmes que ceux des permissions dans chmod(),
cependant certaines plateformes incluent dans le retour des informations sur
le type de fichier donné dans filename
. Les exemples
qui suivent montrent comment tester la valeur de retour concernant les
permissions et le type de fichier sur des systèmes POSIX comme Linux ou macOS.
Pour les fichiers locaux, la valeur spécifique st_mode
de la structure C retournée par la fonction stat() est utilisée.
Les bits affectés peuvent changer en fonction de la plateforme et vous devriez
vous renseigner à son sujet si vous devez analyser les bits ne concernant
pas la permission.
Returns false
on failure.
En cas d'échec, une alerte de type E_WARNING
sera émise.
Exemple #1 Affichage des droits en valeur octale
<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>
L'exemple ci-dessus va afficher :
1777 0644
Exemple #2 Affichage de tous les droits
<?php
$perms = fileperms('/etc/passwd');
switch ($perms & 0xF000) {
case 0xC000: // Socket
$info = 's';
break;
case 0xA000: // Lien symbolique
$info = 'l';
break;
case 0x8000: // Régulier
$info = 'r';
break;
case 0x6000: // Block special
$info = 'b';
break;
case 0x4000: // dossier
$info = 'd';
break;
case 0x2000: // Caractère spécial
$info = 'c';
break;
case 0x1000: // pipe FIFO
$info = 'p';
break;
default: // Inconnu
$info = 'u';
}
// Propriétaire
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// Groupe
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
// Tout le monde
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
echo $info;
?>
L'exemple ci-dessus va afficher :
-rw-r--r--
Note: Les résultats de cette fonction sont mis en cache. Voyez la fonction clearstatcache() pour plus de détails.
À partir de PHP 5.0.0, cette fonction peut aussi être utilisée avec quelques protocoles url. Lisez Liste des protocoles et des gestionnaires supportés pour connaître les protocoles supportant la famille de fonctionnalités 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)