Wer mit PHP Dateien verarbeitet, muss vorher oft wissen, ob eine bestimmte Datei oder ein Verzeichnis überhaupt vorhanden ist. Genau dafür gibt es die Funktion file_exists(). Sie prüft, ob unter dem angegebenen Pfad eine Datei oder ein Ordner existiert und liefert true oder false zurück.
Syntax und Parameter
Die Funktion erwartet genau einen Parameter: den Pfad als String.
file_exists(string $filename): bool
Der Parameter $filename kann ein relativer oder absoluter Pfad sein. Die Funktion gibt true zurück, wenn die Datei oder das Verzeichnis existiert, und false, wenn nicht.
Einfaches Beispiel
Das folgende Beispiel zeigt die grundlegende Verwendung von file_exists(), um zu prüfen, ob eine Textdatei vorhanden ist.
<?php
$dateiname = "meineDatei.txt";
if (file_exists($dateiname)) {
echo "Die Datei $dateiname existiert.";
} else {
echo "Die Datei $dateiname existiert nicht.";
}
?>
Existiert die Datei meineDatei.txt im selben Verzeichnis wie das Script, gibt file_exists() den Wert true zurück und die erste Meldung erscheint. Andernfalls liefert die Funktion false und der else-Zweig wird ausgeführt.
Unterschied zwischen file_exists(), is_file() und is_dir()
Ein häufiger Stolperstein: file_exists() gibt auch dann true zurück, wenn der Pfad auf ein Verzeichnis zeigt. Wer gezielt nur Dateien oder nur Verzeichnisse prüfen möchte, sollte stattdessen is_file() oder is_dir() verwenden.
<?php
$pfad = "uploads";
if (is_dir($pfad)) {
echo "Es handelt sich um ein Verzeichnis.";
} elseif (is_file($pfad)) {
echo "Es handelt sich um eine Datei.";
} else {
echo "Der Pfad existiert nicht.";
}
?>
Mit is_file() lässt sich sicherstellen, dass es sich wirklich um eine Datei handelt. is_dir() erkennt ausschließlich Verzeichnisse. Beide Funktionen geben ebenfalls false zurück, wenn der Pfad nicht existiert.
Praxisbeispiel: Datei nur anlegen, wenn sie fehlt
In der Praxis wird file_exists() oft eingesetzt, bevor eine Datei erstellt oder gelesen wird. So lässt sich vermeiden, dass vorhandene Daten versehentlich überschrieben werden.
<?php
$logDatei = "logs/fehler.log";
if (!file_exists($logDatei)) {
/* Datei existiert noch nicht, also anlegen */
file_put_contents($logDatei, "");
echo "Log-Datei wurde erstellt.";
} else {
echo "Log-Datei ist bereits vorhanden.";
}
?>
Hier wird die Log-Datei nur dann neu erstellt, wenn sie noch nicht vorhanden ist. Das schützt bestehende Einträge vor versehentlichem Löschen.
Caching-Verhalten beachten
PHP speichert das Ergebnis von file_exists() intern im sogenannten Stat-Cache. Wenn sich der Zustand einer Datei während der Laufzeit des Scripts ändert, zum Beispiel weil ein anderer Prozess die Datei löscht, kann file_exists() trotzdem noch true liefern. Um den Cache zu leeren, hilft ein Aufruf von clearstatcache().
<?php
$datei = "temp/cache.tmp";
if (file_exists($datei)) {
unlink($datei);
}
/* Cache leeren, damit der neue
Zustand korrekt erkannt wird */
clearstatcache();
if (!file_exists($datei)) {
echo "Datei wurde erfolgreich entfernt.";
}
?>
Besonders bei länger laufenden Scripts oder in Schleifen, die Dateien anlegen und löschen, ist dieser Punkt wichtig. Ohne clearstatcache() können veraltete Ergebnisse auftreten.
Zusammenfassung
file_exists() ist die einfachste Möglichkeit, in PHP zu prüfen, ob ein Pfad existiert. Für eine genauere Unterscheidung stehen is_file() und is_dir() zur Verfügung. Bei zeitkritischen Operationen sollte der Stat-Cache mit clearstatcache() geleert werden, damit das Ergebnis den tatsächlichen Dateisystem-Zustand widerspiegelt.