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);
?>
fileperms
(PHP 4, PHP 5)
fileperms — Возвращает информацию о правах на файл
Описание
$filename
)Возвращает информацию о правах доступа на файл.
Список параметров
-
filename -
Путь к файлу.
Возвращаемые значения
Возвращает права доступа на указанный файл в числовом виде. Младшие биты этого значения
такие же, как и биты прав доступа для использования в функции chmod(),
однако на большинстве платформ возвращаемое значение будет также включать информацию о типе
файла, который передан в качестве параметра filename. Примеры ниже
демонстрируют как проверить возвращаемое значение на наличие определенных прав и типа файла на
POSIX-системах, включая Linux и Mac OS X.
Для локальных файлов возвращаемое значение является частью структуры st_mode, которая возвращается функцией stat() С-библиотеки. Какие в точности биты установлены может варьироваться от платформы к платформе. Рекомендуется поискать документацию к вашей платформе, если требуется обработка битов возвращаемого значения, не относящихся к правам доступа.
Примеры
Пример #1 Отображение прав доступа в виде восьмеричного числа
<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>
Результат выполнения данного примера:
1777 0644
Пример #2 Отображение полных прав доступа
<?php
$perms = fileperms('/etc/passwd');
if (($perms & 0xC000) == 0xC000) {
// Сокет
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
// Символическая ссылка
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
// Обычный
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
// Специальный блок
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
// Директория
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
// Специальный символ
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
// Поток FIFO
$info = 'p';
} else {
// Неизвестный
$info = 'u';
}
// Владелец
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// Группа
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
// Мир
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
echo $info;
?>
Результат выполнения данного примера:
-rw-r--r--
Ошибки
В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.
Примечания
Замечание: Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache().
Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обертками url. Список оберток, поддерживаемых семейством функций stat(), смотрите в Поддерживаемые протоколы и обработчики (wrappers).
Смотрите также
- chmod() - Изменяет режим доступа к файлу
- is_readable() - Определяет существование файла и доступен ли он для чтения
- stat() - Возвращает информацию о файле
If you want to test if a file have the permission requirement (let say prior to do a chmod, avoiding doing useless chmod), you can do this:
<?php
$wantedPerms = 0644;
$actualPerms = fileperms($file);
if($actualPerms < $wantedPerms)
chmod($file, $wantedPerms);
?>
Here is a small function I made : http://pastebin.com/iKky8Vtu
I was bored and I thought it could be useful.
mixed mkperms( string $perms [, bool return_as_string = false [, string $filename ] ] )
Returns permissions given a string in literal format and a filename.
If the file name is omitted, the permissions that the function will return are based on 000-permissions.
If return_as_string is set to true, the result will be output as a 644 format string. Otherwise it will return a string converted to base-10 for chmod.
Examples:
<?php
echo mkperms('u+r', true), "\n"; // 400
echo mkperms('u+rwx,g+rw,o+x', true), "\n"; // 761
touch('myfile.txt'); // Create a file with any permissions
chmod('myfile.txt', mkperms('u=rwx,g=x,o=rw')); // myfile.txt is now at -rwx--xrw-
// Make a file and give it full permissions
touch('somefile.txt');
chmod('somefile.txt', 0777);
echo mkperms('g-w,o-rw', true, 'somefile.txt'); // 751
echo mkperms('u=rwx,g-r,o=-', true, 'somefile.txt'); // 730
// This way you can apply permissions to files
chmod('somefile.txt', mkperms('u=rwx,g-r,o=-', false, 'somefile.txt')); // somefile.txt is now at -rwx-wx---
?>
PS : sorry I had to put it on pastebin, or else it just made the note way too long.
Since the output of decoct( fileperms('.') ) is of the form: 40644
It seems the previous example is wrong, instead you should understand:
To get permissions formatted as "644":
<?php
echo substr(decoct( fileperms('.') ), 2);
?>
To get permissions formatted as "0644":
<?php
echo substr(decoct( fileperms('.') ), 1);
?>
An easy way to calculate fileperms to chmod is this:
substr(decoct(fileperms("test.html")),3);
Displays 666 or 777 (depends on chmod set).
substr(decoct(fileperms("test.html")),2);
Displays 0666 or 0777 and refers immediately to the number set with chmod();
If you only want the permissions (lowest three octal numbers) you can use a bitwise AND to mask the bits:
<?php
fileperms($file) & 511;
?>
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);
On Linux (not tested on Windows), if you want a chmod-like permissions, you can use this function:
<?php
function file_perms($file, $octal = false)
{
if(!file_exists($file)) return false;
$perms = fileperms($file);
$cut = $octal ? 2 : 3;
return substr(decoct($perms), $cut);
}
?>
Using it:
$ touch foo.bar
$ chmod 0754 foo.bar
<?php
echo file_perms('foo.bar'); // prints: 754
echo file_perms('foo.bar', true); // prints 0754
?>
