- Informationen zu Dateien
- Dateioperationen
- Verzeichnis-Inhalt auslesen
- Übungen
Inhaltsverzeichnis
Informationen zu Dateien
PHP stellt einige praktische Hilfsfunktionen zur Verfügung, mit denen wir Informationen zu einer Datei oder einem Verzeichnis erhalten. Einge dieser Funktionen sind:
file_exists() | Diese Funktion überprüft, ob eine bestimmte Datei oder ein Verzeichnis(!) schon exisitert. |
is_file() | Prüft, ob es sich um eine Datei handelt. |
is_dir() | Prüft, ob es sich um ein Verzeichnis handelt. |
is_executable() | Ist es eine auszuführende Datei? |
Wir legen nun eine Datei namens "test.txt" auf unseren Server ab und testen die einzelnen Funktionen durch:
echo file_exists("test.txt") . "<br>"; // true
echo is_file("test.txt") . "<br>"; // true
echo is_dir("test.txt") . "<br>"; // false
echo is_executable("test.txt") . "<br>"; // false
Weitere Datei-Informationen über stat()
Weitere nützliche Datei-Informationen erhalten wir über die Funktion stat(), welche die Infos zur Datei in einem Array speichert. Zwei nützliche Elemente sind zum Beispiel:
$datei = "meineDatei.txt";
$info = stat($datei);
echo $info[7]; // Größe der Datei in Bytes
echo date("d.m.Y H:i:s", $info[9]); // Zeitpunkt der letzten Änderung
Weitere Elemente des Arrays der Funktion stat() können wir auf php.net lesen.
__FILE__
Den ganzen Pfadnamen der aktuellen Datei erhalten wir übrigens mittels der "magischen Konstante" __FILE__:
echo __File__; // /var/www/falconbyte/php-datei-handling.php
Dateioperationen
Mit PHP ist es ohne Weiteres möglich, direkt in das bestehende Dateisystem einzugreifen und Dateien sowie Verzeichnisse zu erstellen, zu ändern oder zu löschen. Hierzu die entsprechenden Funktionen:
copy("Quelle", "Ziel") | Datei kopieren |
rename("Quelle", "Ziel") | Datei oder Verzeichnis umbenennen |
unlink("Datei") | Datei löschen |
mkdir("Verzeichnis") | Verzeichnis erstellen |
rmdir("Verzeichnis") | leeres Verzeichnis löschen |
Verzeichnis-Inhalt auslesen
Bis zu diesem Punkt haben wir immer nur eine Datei untersucht. PHP bietet daneben auch Funktionen an, mit denen wir den Inhalt von Verzeichnissen unter die Lupe nehmen können.
Dateien aus Verzeichnis auslesen
Mit der Funktion opendir() können wir einen Dateizeiger auf ein Verzeichnis öffnen. Die Funktion readdir() wiederum liefert jeweils ein Objekt (Datei oder Ordner) im Verzeichnis zurück und bewegt den Dateizeiger um einen Eintrag nach vorn. readdir() liefert jedoch false als Rückgabewert, wenn kein Objekt mehr gefunden wurde. Die Funktion kann mit einer while-Schleife darum solange wiederholt werden, bis alle Objekte im Verzeichnis durchiteriert sind:
$d = opendir(".");
while(($eintrag = readdir($d)) !== false){
echo $eintrag . "<br>";
}
closedir($d);
Der vorliegende PHP-Code liest alle Dateien und Ordner aus dem Stammverzeichnis (".") aus. Damit das funktioniert, muss sich das Script im selben Verzeichnis befinden. Zum Schluß sollten wir das Datei-Handle mit closedir() wieder beenden.
Beim Aufrufen des Skripts erhalten wir eine Liste aller Objekte im Verzeichnis (Ordner sind an den fehlenden Dateiendungen zu erkennen):
Die Einträge werden in der Reihenfolge zurückgegeben, in der sie innerhalb des Filesystems angelegt wurden.
Unterverzeichnis öffnen
Um ein Unterverzeichnis zu öffnen, den Inhalt auszulesen und dann wieder zu schließen, gehen Sie wie folgt vor:
$dir = "./images/";
if (is_dir($dir)){
if ($dh = opendir($dir)){
while (($file = readdir($dh)) !== false){
echo "filename:" . $file . "<br>";
}
closedir($dh);
}
}
Ratsam ist übrigens der Einsatz der Funktion is_dir(), um zu prüfen, ob das Verzeichnis auch wirklich existiert. Falls wir nämlich versuchen, ein nicht vorhandenes Verzeichnis zu öffnen, führt das zwangsläufig zum Absturz des Scripts.
Auslassen der Punkte . und ..
Sicherlich sind Ihnen in den ersten beiden Zeilen die Punkte . und .. aufgefallen. Der erste Punkt zu Beginn repräsentiert das aktuelel Verzeichnis und der doppelte Punkt darunter bezieht sich auf das übergeordnete Verzeichnis.
Das ist ja schön und gut, aber in der Regel eine überflüssige Information. Für eine Ausgabe ohne diese Punkte können wir das Skript um eine einfache if-Prüfung erweitern:
$d = opendir(".");
while(($eintrag = readdir($d)) !== false){
if($eintrag !== "." && $eintrag !== ".."){
echo $eintrag . "<br>";
}
}
closedir($d);
Nur Dateien anzeigen
Wie schon gesagt, liefert readdir() gleichsam Dateien wie Verzeichnisse zurück. Wollen wir hingegen ausschließlich Dateien angezeigt bekommen, können wir die Hilfsfunktion is_file() zum Filtern anwenden:
$d = opendir(".");
while(($eintrag = readdir($d)) !== false){
if(is_file($eintrag)){ // Nur Dateien!
echo $eintrag . "<br>";
}
}
closedir($d);
Ausgabe sortieren
Um die Ausgabe der Objekte nun auch noch zu sortieren (z.B. in alphabetischer Reihenfolge), bringen wir ein Array ins Spiel:
$liste = array();
$d = opendir(".");
while(($eintrag = readdir($d)) !== false){
if(is_file($eintrag)){
array_push($liste, $eintrag); // Eintrag im Array speichern
}
}
closedir($d);
// Array sortieren
asort($liste);
// Array auslesen
foreach ($liste as $value) {
echo $value . "<br>";
}
Die einzelnen Datei-Einträge werden zunächst sukzessive dem Array $liste hinzugefügt. Nachdem das Verzeichnis fertig ausgelesen wurde, werden die Elemente des Arrays mit asort() alphabetisch sortiert und anschließend mit einer foreach-Schleife am Bildschirm ausgegeben.
Übungen
einfach
Laden Sie eine beliebige Datei auf Ihren Server (z.B. datei.txt). Kopieren Sie die Datei mit der entsprechenden PHP-Funktion (z.B. zu "datei2.txt"). Löschen Sie in der nächsten Programmzeile die Ursprungsdatei.
mittel
Geben Sie eine Liste mit allen Dateien eines Verzeichnisses am Bildschirm aus - und verlinken Sie diese mit den jeweiligen Dateien:
Viel Spaß dabei 😅
schwer
Bereit für den Diamenten? Es folgt eine wirklich knifflige Aufgabe 🧐
Erstellen Sie eine neue Datei "upload.php"
Laden Sie über ein Upload-Formular beliebige Dateien hoch (z.B. datei.txt, datei2.txt).
Geben Sie anschließend auf der gleichen Seite den Inhalt des Verzeichnisses aus, wobei das Upload-Datum der hochgeladenen Dateien angezeigt werden soll.
So sollte das am Ende für den Nutzer aussehen:
Tipp: Setzen Sie mit der Funktion touch() den Zeitpunkt der letzten Änderung mit dem Uploaddatum gleich. Diese Zeitangebe erhalten Sie dann gewohnt über stat().