11.10.20 2722 Views 4

credit: ©tippapatt

PHP Tutorial #32

Das Dateisystem in PHP

In PHP gibt es einige nützliche Funktionen, mit denen wir einfach und bequem auf das Dateisystem zugreifen und es verändern können. Diese Funktionen gehören zum Kern von PHP und können sofort eingesetzt werden. Na dann: Sehen wir uns das doch einmal genauer an!

Download als eBook

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):

opendir alle Dateien PHP Verzeichnis auslesen

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.

Lösung ein-/ausblenden

mittel

Geben Sie eine Liste mit allen Dateien eines Verzeichnisses am Bildschirm aus - und verlinken Sie diese mit den jeweiligen Dateien:

Viel Spaß dabei 😅

Lösung ein-/ausblenden

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().

Lösung ein-/ausblenden

Java lernen

text text

PHP Lernen

zur PHP

JavaScript lernen

move nove move

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen