Start · Sprachen · PHP · Referenz · fstat

fstat

Funktion

Gibt ein assoziatives Array mit Metainformationen (Größe, Timestamps, Berechtigungen usw.) zu einer über einen Dateihandle geöffneten Datei zurück.

seit PHP 4.0.0 Kategorie: io

Signatur

fstat(resource $stream): array|false

Beschreibung

fstat() funktioniert ähnlich wie stat(), arbeitet jedoch nicht mit einem Dateipfad, sondern mit einem bereits geöffneten Datei-Handle (Resource). Das ist besonders nützlich, wenn eine Datei bereits geöffnet ist und ein erneutes Öffnen vermieden werden soll oder wenn der genaue Pfad nicht mehr bekannt ist.

Der Rückgabewert ist ein Array mit 26 Elementen – 13 numerisch indexiert und 13 assoziativ. Wichtige Felder sind: size (Dateigröße in Bytes), mtime (Zeitpunkt der letzten Änderung als Unix-Timestamp), mode (Dateiberechtigungen), uid/gid (Eigentümer-IDs) sowie ino (Inode-Nummer).

fstat() ist besonders praktisch nach Schreiboperationen, um die tatsächliche Dateigröße zu prüfen, oder in Szenarien, in denen race conditions bei wiederholtem Zugriff auf den Dateipfad vermieden werden sollen. Da die Funktion auf dem bereits geöffneten Handle arbeitet, spiegelt sie den aktuellen Zustand der Datei wider.

Auf Windows-Systemen sind einige Felder wie uid, gid und ino immer 0, da das Windows-Dateisystem diese Konzepte nicht unterstützt.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein gültiges Datei-Handle, das z. B. durch fopen() geöffnet wurde.

Rückgabewert

Typ
array|false
Beschreibung
Gibt bei Erfolg ein Array mit Dateiinformationen zurück (sowohl numerisch als auch assoziativ indexiert). Bei einem Fehler wird false zurückgegeben. Die wichtigsten assoziativen Schlüssel sind: dev, ino, mode, nlink, uid, gid, rdev, size, atime, mtime, ctime, blksize, blocks.

Beispiele

Dateigröße nach dem Schreiben prüfen

<?php
$handle = fopen('/tmp/beispiel.txt', 'w+');
fwrite($handle, 'Hallo, Welt!');

$info = fstat($handle);
echo 'Dateigröße: ' . $info['size'] . ' Bytes' . PHP_EOL;
echo 'Letzte Änderung: ' . date('Y-m-d H:i:s', $info['mtime']) . PHP_EOL;

fclose($handle);
Dateigröße: 12 Bytes Letzte Änderung: 2024-05-01 14:32:10

Dateiberechtigungen auslesen und formatieren

<?php
$handle = fopen('/tmp/beispiel.txt', 'r');

if ($handle === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$info = fstat($handle);
// Oktale Darstellung der Dateirechte
$modeOktal = sprintf('%o', $info['mode']);
echo 'Dateirechte (oktal): ' . $modeOktal . PHP_EOL;
echo 'Inode: ' . $info['ino'] . PHP_EOL;
echo 'Eigentümer-UID: ' . $info['uid'] . PHP_EOL;

fclose($handle);
Dateirechte (oktal): 100644 Inode: 2621441 Eigentümer-UID: 1000

Vergleich von fstat und stat nach Dateiänderung

<?php
$pfad = '/tmp/vergleich.txt';
$handle = fopen($pfad, 'w+');
fwrite($handle, str_repeat('x', 1024));

// fstat liefert aktuellen Stand über den offenen Handle
$fstatInfo = fstat($handle);

// stat liefert möglicherweise gecachte Werte
clearstatcache();
$statInfo = stat($pfad);

echo 'fstat Größe: ' . $fstatInfo['size'] . ' Bytes' . PHP_EOL;
echo 'stat Größe:  ' . $statInfo['size'] . ' Bytes' . PHP_EOL;

fclose($handle);
fstat Größe: 1024 Bytes stat Größe: 1024 Bytes

// Wichtig · Fallstricke

Stat-Cache: Im Gegensatz zu stat() unterliegt fstat() nicht dem PHP-internen Stat-Cache. Bei stat() können veraltete Werte zurückgegeben werden, sofern kein clearstatcache() aufgerufen wird – bei fstat() entfällt dieses Problem.

Windows-Einschränkungen: Auf Windows-Systemen sind die Felder ino, uid und gid immer 0. Das Feld blksize liefert dort ebenfalls -1.

Netzwerk-Streams: Bei Netzwerk-Streams oder bestimmten Stream-Wrappern kann fstat() unvollständige oder leere Ergebnisse zurückliefern, da nicht alle Metadaten verfügbar sind.