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 — Dosya izinlerini döndürür
dosyaismi
Dosya yolu.
Dosyanın izinlerini sayısal kip olarak döndürür. Bu kipin daha düşük
bitleri, chmod() tarafından beklenen izinlerle aynıdır,
ancak çoğu platformda, dönüş değeri dosyaismi
olarak verilen dosya türü hakkında bilgi de içerir. Aşağıdaki örnekler,
Linux ve macOS dahil olmak üzere POSIX sistemlerinde belirli izinler ve
dosya türleri için dönüş değerinin nasıl sınanacağını göstermektedir.
Yerel dosyalara özgü dönüş değeri, C kütüphanesinin
stat() işlevi tarafından döndürülen yapının
st_mode
üyesinin değeridir. Tam olarak hangi bitlerin
atanacağı platformdan platforma değişebilir ve dönüş değerinin izin
verilmeyen bitlerinin ayrıştırılması gerekiyorsa özel platformunuzun
belgelerine bakmanız önerilir.
Başarısızlık durumunda false
döner.
Başarısızlık durumunda bir
E_WARNING
çıktılanır.
Örnek 1 - İzinlerin sekizlik değer olarak gösterilmesi
<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>
Yukarıdaki örneğin çıktısı:
1777 0644
Örnek 2 - Tüm izinlerin gösterilmesi
<?php
$perms = fileperms('/etc/passwd');
switch ($perms & 0xF000) {
case 0xC000: // soket
$info = 's';
break;
case 0xA000: // Sembolik bağ
$info = 'l';
break;
case 0x8000: // Sıradan dosya
$info = 'r';
break;
case 0x6000: // Blok aygıtı
$info = 'b';
break;
case 0x4000: // Dizin
$info = 'd';
break;
case 0x2000: // Karakter aygıtı
$info = 'c';
break;
case 0x1000: // FIFO boru
$info = 'p';
break;
default: // Bilinmiyor
$info = 'u';
}
// Kullanıcı
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// Grup
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
// Herkes
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
echo $info;
?>
Yukarıdaki örneğin çıktısı:
-rw-r--r--
Bilginize: Bu işlevin sonuçları önbelleğe kaydedilir. Daha ayrıntılı bilgi clearstatcache() işlevinde bulunabilir.
PHP 5.0.0 sürümünden itibaren bu işlev bazı URL sarmalayıcıları ile kullanılabilmektedir. stat() ailesini destekleyen sarmalayıcıların listesi Desteklenen Protokoller ve Sarmalayıcılar başlığı altında bulunabilir.
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)