fileperms
(PHP 4, PHP 5, PHP 7)
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() - Возвращает информацию о файле
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с файловой системой
- Функции для работы с файловой системой
- basename
- chgrp
- chmod
- chown
- clearstatcache
- copy
- delete
- dirname
- disk_free_space
- disk_total_space
- diskfreespace
- fclose
- feof
- fflush
- fgetc
- fgetcsv
- fgets
- fgetss
- file_exists
- file_get_contents
- file_put_contents
- file
- fileatime
- filectime
- filegroup
- fileinode
- filemtime
- fileowner
- fileperms
- filesize
- filetype
- flock
- fnmatch
- fopen
- fpassthru
- fputcsv
- fputs
- fread
- fscanf
- fseek
- fstat
- ftell
- ftruncate
- fwrite
- glob
- is_dir
- is_executable
- is_file
- is_link
- is_readable
- is_uploaded_file
- is_writable
- is_writeable
- lchgrp
- lchown
- link
- linkinfo
- lstat
- mkdir
- move_uploaded_file
- parse_ini_file
- parse_ini_string
- pathinfo
- pclose
- popen
- readfile
- readlink
- realpath_cache_get
- realpath_cache_size
- realpath
- rename
- rewind
- rmdir
- set_file_buffer
- stat
- symlink
- tempnam
- tmpfile
- touch
- umask
- unlink
Коментарии
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);
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);
?>
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);
?>
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)