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);
?>fileperms
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
fileperms
Референца за `function.fileperms.php` со подобрена типографија и навигација.
fileperms
(PHP 4, PHP 5, PHP 7, PHP 8)
fileperms — Ги добива дозволите за датотеката
Параметри
filename-
Патека до датотеката.
Вратени вредности
Враќа дозволите на датотеката како нумерички режим. Пониските битови на овој режим се исти како дозволите што се очекуваат од chmod(), меѓутоа на повеќето платформи вратената вредност ќе вклучува и информации за типот на датотеката дадена како filename. Примерите подолу покажуваат како да се тестира вратената вредност за специфични дозволи и типови датотеки на POSIX системи, вклучувајќи Linux и macOS.
За локални датотеки, специфичната вратена вредност е онаа на
st_mode член на структурата вратена од C библиотеката stat() функција. Точно кои битови се поставени може да варираат од платформа до платформа, и се препорачува да се погледне документацијата на вашата специфична платформа ако е потребно парсирање на битовите што не се дозволи на вратената вредност.
Патеката до PHP скриптата што треба да се провери. false при неуспех.
Errors/Exceptions
Бидејќи типот на податоци integer во PHP е со знакот и многу платформи користат 32-битни integers, некои функции за датотечниот систем може да вратат неочекувани резултати за датотеки поголеми од 2GB. E_WARNING се емитува.
Примери
Пример #1 Прикажи дозволи како октална вредност
<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
1777 0644
Пример #2 Прикажи целосни дозволи
<?php
$perms = fileperms('/etc/passwd');
switch ($perms & 0xF000) {
case 0xC000: // socket
$info = 's';
break;
case 0xA000: // symbolic link
$info = 'l';
break;
case 0x8000: // regular
$info = 'r';
break;
case 0x6000: // block special
$info = 'b';
break;
case 0x4000: // directory
$info = 'd';
break;
case 0x2000: // character special
$info = 'c';
break;
case 0x1000: // FIFO pipe
$info = 'p';
break;
default: // unknown
$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;
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
-rw-r--r--
Белешки
Забелешка: Имајте предвид дека резолуцијата на времето може да се разликува од еден датотечен систем до друг. clearstatcache() за повеќе детали.
Резултатите од оваа функција се кеширани. Погледнете some Од PHP 5.0.0, оваа функција може да се користи и со Поддржани протоколи и обвивки URL обвивки. Погледнете stat() за да се утврди кои обвивки поддржуваат
Види Исто така
- chmod() - Ги менува режимот на датотеката
- is_readable() - Проверува дали постои датотека или директориум
- stat() - Дава информации за датотека
Белешки од корисници 4 белешки
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);
?>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)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);