file_exists()
Die Funktion file_exists() prüft, ob eine Datei oder ein Verzeichnis existiert, und gibt TRUE oder FALSE zurück.
Was ist die Funktion file_exists()?
Die Funktion file_exists() ist eine eingebaute PHP-Funktion, die prüft, ob ein angegebener Pfad auf eine Datei oder ein Verzeichnis im Dateisystem zeigt. Sie ist eine der häufigsten Methoden, um Dateioperationen abzusichern — Sie rufen sie vor dem Lesen, Schreiben oder Löschen auf, damit Ihr Skript nicht bei einem fehlenden Pfad abstürzt.
Sie gibt zurück:
true, wenn der Pfad existiert (egal ob es sich um eine reguläre Datei, ein Verzeichnis, einen Symlink oder eine andere Sonderdatei handelt), oderfalse, wenn unter diesem Pfad nichts existiert, oder wenn Sie keine Berechtigung haben, die Informationen darüber zu lesen.
Syntax
file_exists(string $filename): bool$filename ist der zu prüfende Pfad. Er kann sein:
- ein relativer Pfad (
'data/users.csv'), der relativ zum aktuellen Arbeitsverzeichnis aufgelöst wird, oder - ein absoluter Pfad (
'/var/www/uploads/logo.png'oder'C:\\temp\\file.txt'unter Windows).
Ein einfaches Beispiel
Wenn myfile.txt im Arbeitsverzeichnis des Skripts vorhanden ist, wird der erste Zweig ausgeführt; andernfalls der else-Zweig. Da file_exists() einen einfachen boolean zurückgibt, können Sie es direkt in einem if-, &&- oder Ternärausdruck verwenden.
Achtung beim Stat-Cache
PHP speichert die Ergebnisse von Dateisystem-Prüfungen (einschließlich file_exists()) zwischen, um wiederholte Festplattenzugriffe zu vermeiden. Innerhalb einer einzigen Skriptausführung kann es passieren, dass Sie einen Pfad prüfen, ihn dann erstellen oder löschen und beim erneuten Prüfen noch immer die alte Antwort erhalten.
Rufen Sie clearstatcache() auf, um eine neue Abfrage zu erzwingen:
<?php
$path = 'temp.txt';
file_put_contents($path, 'hello'); // create the file
clearstatcache(); // forget the cached result
var_dump(file_exists($path)); // bool(true)
unlink($path); // delete the file
clearstatcache();
var_dump(file_exists($path)); // bool(false)Dieses Caching ist wichtig bei lang laufenden Skripten und Schleifen, die Dateien dynamisch erstellen oder entfernen.
file_exists() vs. is_file() vs. is_dir()
file_exists() kann Ihnen nicht sagen, was dort existiert — nur dass etwas existiert. Wenn Sie es genau wissen müssen, greifen Sie auf eine präzisere Funktion zurück:
| Funktion | Gibt true zurück, wenn der Pfad… |
|---|---|
file_exists() | eine Datei oder ein Verzeichnis ist (beliebig) |
is_file() | eine reguläre Datei ist |
is_dir() | ein Verzeichnis ist |
is_readable() | existiert und vom aktuellen Prozess lesbar ist |
is_writable() | existiert und vom aktuellen Prozess beschreibbar ist |
Ein häufiger Fehler ist die Verwendung von file_exists(), um zu bestätigen, dass ein Pfad eine Datei ist, bevor man sie öffnet. Wenn ein Verzeichnis zufällig denselben Namen trägt, gibt file_exists() true zurück, aber fopen() schlägt dann fehl. Bevorzugen Sie in diesem Fall is_file().
Häufige Anwendungsfälle
Eine Leseoperation absichern, damit keine Warnung ausgelöst wird:
<?php
$config = 'config.php';
if (is_file($config)) {
require $config;
} else {
die('Configuration file is missing.');
}Überschreiben eines vorhandenen Uploads verhindern, indem ein numerisches Suffix hinzugefügt wird:
<?php
$target = 'upload.png';
$i = 1;
while (file_exists($target)) {
$target = "upload-$i.png";
$i++;
}
echo "Saving to: $target";Eine Datei nur löschen, wenn sie vorhanden ist, damit unlink() nicht vor einem fehlenden Pfad warnt:
<?php
$tmp = 'cache.tmp';
if (file_exists($tmp)) {
unlink($tmp);
}Wichtige Hinweise
- Race Conditions. Eine Datei kann von einem anderen Prozess zwischen Ihrer
file_exists()-Prüfung und der nachfolgenden Operation erstellt oder gelöscht werden. Bei kritischen Schreibvorgängen ist es oft sicherer, die Operation zu versuchen und den Fehler zu behandeln, als zuvor zu prüfen. - Berechtigungen. Wenn das Verzeichnis, das zur Datei führt, für den PHP-Prozess nicht zugänglich ist, gibt
file_exists()falsezurück, selbst wenn die Datei physisch vorhanden ist. - Remote-URLs. Mit der richtigen Konfiguration kann
file_exists()bei einigen Stream-Wrappern funktionieren, aber es prüfthttp://-URLs nicht zuverlässig — verwenden Sie stattdessen eine Funktion wiefile_get_contents()mit Fehlerbehandlung.
Für einen tieferen Einblick in das Lesen und Schreiben von Dateien, lesen Sie das Kapitel PHP File Handling.