ConFoo 2025

fileperms

(PHP 4, PHP 5, PHP 7, PHP 8)

filepermsLiefert die Zugriffsrechte einer Datei

Beschreibung

fileperms(string $filename): int|false

Gibt die Zugriffsrechte für die übergebene Datei zurück.

Parameter-Liste

filename

Der Pfad zur Datei.

Rückgabewerte

Gibt die Zugriffsrechte einer Datei als numerischen Modus zurück. Die niedrigen Bits dieses Modus sind die gleichen wie die Zugriffsrechte, die chmod() erwartet, allerdings beinhaltet der Rückgabewert auf den meisten Plattformen ebenfalls Informationen über den Typ der Datei, die als filename angegeben wurde. Die Beispiele weiter unten demonstrieren wie der Rückgabewert auf spezifische Zugriffsrechte und Dateitypen auf POSIX-Systemen einschließlich Linux und macOS geprüft werden kann.

Für lokale Dateien wird der spezifische st_mode-Wert der C-Struktur verwendet, die von der Funktion stat() zurückgegeben wird. Die betroffenen Bits können sich je nach Plattform ändern und wenn es erforderlich ist, Bits des Rückgabewertes zu analysieren, die nicht die Zugriffsrechte betreffen, wird empfohlen, in der Dokumentation der jeweiligen Plattform nachzuschlagen.

Gibt bei einem Fehler false zurück.

Fehler/Exceptions

Im Fehlerfall wird eine E_WARNING ausgegeben.

Beispiele

Beispiel #1 Zeige die Zugriffsrechte als Oktalwert an

<?php
echo substr(sprintf('%o', fileperms('/tmp')), -4);
echo
substr(sprintf('%o', fileperms('/etc/passwd')), -4);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

1777
0644

Beispiel #2 Zeige die kompletten Zugriffsrechte an

<?php
$perms
= fileperms('/etc/passwd');

switch (
$perms & 0xF000) {
case
0xC000: // Socket
$info = 's';
break;
case
0xA000: // Symbolischer Link
$info = 'l';
break;
case
0x8000: // Regulär
$info = 'r';
break;
case
0x6000: // Block special
$info = 'b';
break;
case
0x4000: // Verzeichnis
$info = 'd';
break;
case
0x2000: // Character special
$info = 'c';
break;
case
0x1000: // FIFO pipe
$info = 'p';
break;
default:
// unbekannt
$info = 'u';
}

// Besitzer
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
((
$perms & 0x0800) ? 's' : 'x' ) :
((
$perms & 0x0800) ? 'S' : '-'));

// Gruppe
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
((
$perms & 0x0400) ? 's' : 'x' ) :
((
$perms & 0x0400) ? 'S' : '-'));

// Andere
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
((
$perms & 0x0200) ? 't' : 'x' ) :
((
$perms & 0x0200) ? 'T' : '-'));

echo
$info;
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

-rw-r--r--

Anmerkungen

Hinweis: Die Ergebnisse dieser Funktion werden zwischengespeichert. Weitere Details sind bei clearstatcache() zu finden.

Tipp

Seit PHP 5.0.0 kann diese Funktion mit einigen URL-Wrappern benutzt werden. Schauen Sie in der Liste unter Unterstützte Protokolle und Wrapper nach, welcher Wrapper die Funktionalität von stat() unterstützt.

Siehe auch

  • chmod() - Ändert den Modus für die Zugriffsrechte einer Datei
  • is_readable() - Prüft, ob eine Datei existiert und lesbar ist
  • stat() - Sammelt Informationen über eine Datei

add a note

User Contributed Notes 4 notes

up
36
coolmic at example dot com
11 years ago
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);
?>
up
6
admin at torntech dot com
12 years ago
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);

?>
up
4
paul2712 at gmail dot com
17 years ago
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);
up
0
chris at ocproducts dot com
4 years ago
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)
To Top