# 4.9.3 Dateien lesen und schreiben

Um Dateien vollständig zu lesen oder zu schreiben, sprich ohne sich viel Gedanken um einen Dateizeiger machen zu müssen, kann man die folgenden Befehle nutzen. Diese bieten einen einfachen und schnellen Weg, Daten zu lesen oder zu schreiben.

Dateien lesen und schreiben, einfache Funktionen

Funktion | Beschreibung
--- | ---
file_exists() | Prüft, ob eine Datei existiert.
file_put_contents() | Schreibt den Inhalt einer String-, oder Array-Variable in eine Datei.
file_get_contents() | Liest den Inhalt einer Datei in einen String.
file() | Liest eine ganze Datei zeilenweise in ein Array.
readfile() | Liest eine ganze Datei ein und gibt dieses direkt auf dem Browser aus.

Somit lassen sich recht einfach Text oder Daten in eine Datei schreiben und wieder auslesen.

Beispiel

Text in Datei a.txt schreiben und auslesen:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $textIn = "Dies ist ein Beispiel-Text.\nZweite Zeile";

    // Text in Datei a.txt schreiben
    file_put_contents("a.txt", $textIn);

    // Text aus der Datei a.txt auslesen
    $textOut = file_get_contents("a.txt");
    print_r($textOut);

Ausgabe:
Dies ist ein Beispiel-Text. Zweite Zeile

## file()

Beim Auslesen gibt es neben der Funktion `file_get_contents()` auch die Möglichkeit, die Funktion `file()` zu nutzen. Dabei unterscheiden sich die beiden hauptsächlich in der Art der Ausgabe. Während die Funktion `file_get_contents()` den Inhalt der Datei als String zurück gibt, gibt die Funktion `file()` den Inhalt der Datei als Array zurück. Dabei enthält jedes Element des Arrays eine Zeile des Dateiinhalts, was manchmal sehr praktisch ist!

Beispiel

Eine Datei auslesen mit `file()`

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $textIn = "Dies ist ein Beispiel-Text.\nZweite Zeile";

    // Text in Datei a.txt schreiben
    file_put_contents("a.txt", $textIn);

    // Text aus der Datei a.txt auslesen
    $textOut = file("a.txt");
    print_r($textOut);

Ausgabe:
Array ( [0] => Dies ist ein Beispiel-Text. [1] => Zweite Zeile )

## readfile()

Auch mit readfile() kann eine Datei einfach ausgelesen werden. Dabei hat `readfile()` die Eigenart, dass die Datei direkt auf dem Browser ausgegeben wird, also ohne die Verwendung von `print_r()`. Damit eignet sich `readfile()` vorallem zum Debugging, um schnell mal festzustellen, was sich in der Datei befindet.

Im Gegensatz zu `file_get_contents()`, die den Inhalt in einen String liest, sendet `readfile()` den Inhalt direkt an den Output-Buffer, was in einigen Fällen effizienter sein kann, besonders wenn es um die Ausgabe größerer Dateien geht.

Beispiel

Eine Datei direkt ausgeben mit `readfile()`

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $textIn = "Dies ist ein Beispiel-Text.\nZweite Zeile";

    // Text in Datei a.txt schreiben
    file_put_contents("a.txt", $textIn);

    // Text aus der Datei a.txt auslesen
    readfile("a.txt");

Ausgabe:
Dies ist ein Beispiel-Text. Zweite Zeile

Dies ist besonders praktisch, wenn Dateien wie Bilder oder PDFs ausgegeben werden sollen, ohne dass sie zuerst komplett in den Speicher geladen werden müssen. Stattdessen wird die Datei direkt an den Client gestreamt.

Beispiel

Ein Bild direkt an den Browser senden:

    1
    2
    3
    <?php
    header("Content-Type: image/png");
    readfile("bild.png");

Dabei ist zu beachten, dass vor dem Aufruf von `readfile()` keine weiteren Ausgaben stattgefunden haben dürfen, da sonst der HTTP-Header nicht korrekt gesetzt werden kann.

Hinweis

PHP bietet umfangreiche Möglichkeiten zum Lesen und Schreiben von Dateien, die von einfachen Textdateien bis zu komplexeren Datenformaten und binären Dateien reichen. Es ist wichtig, die richtige Funktion für den jeweiligen Anwendungsfall zu wählen, um die Performance und Effizienz der Anwendung zu optimieren.

## Teile einer Datei auslesen

Sind jedoch nur Teile einer Datei von Interesse, kann man die folgenden Befehle in Kombination verwenden. Hiermit sind weitaus komplexere Abfragen und Zugriffe auf Dateien möglich.

Funktion | Beschreibung
--- | ---
fopen() | Öffnet eine Datei
feof() | Prüft, ob der Dateizeiger am Ende der Datei steht
fgets() | Liest eine Zeile von Beginn des Dateizeigers
fread() | Liest Binärdaten aus einer Datei
fwrite() | Schreibt den Inhalt einer Zeichenkette in eine Datei. Die Zeichenkette kann auch binäre Daten enthalten (= Binär-sicheres Schreiben).
fclose() | Schließt den geöffneten Dateizeiger

Für `fopen("Dateiname", "Aktion")` sind folgende Aktionen zugelassen:

Aktion | Beschreibung vom Manual
--- | ---
`r` | Öffnet die Datei nur zum Lesen und positioniert den Dateizeiger auf den Anfang der Datei.
`r+` | Öffnet die Datei zum Lesen und Schreiben und setzt den Dateizeiger auf den Anfang der Datei.
`w` | Öffnet die Datei nur zum Schreiben und setzt den Dateizeiger auf den Anfang der Datei sowie die Länge der Datei auf 0 Byte. Wenn die Datei nicht existiert, wird versucht sie anzulegen.
`w+` | Öffnet die Datei zum Lesen und Schreiben und setzt den Dateizeiger auf den Anfang der Datei sowie die Länge der Datei auf 0 Byte. Wenn die Datei nicht existiert, wird versucht sie anzulegen.
`a` | Öffnet die Datei nur zum Schreiben. Positioniert den Dateizeiger auf das Ende der Datei. Wenn die Datei nicht existiert, wird versucht sie anzulegen.
`a+` | Öffnet die Datei zum Lesen und Schreiben. Positioniert den Dateizeiger auf das Ende der Datei. Wenn die Datei nicht existiert, wird versucht sie anzulegen.

Beispiel

Eine Datei zeilenweise auslesen und auf dem Browser ausgeben.

    1
    2
    3
    4
    5
    6
    7
    <?php
    $testfile = fopen("a.txt", "r");
    while (!feof($testfile)) {
        $line = fgets($testfile, 1000);
        echo "$line <br>";
    }
    fclose($testfile);

Ausgabe (der zuvor angelegten Datei a.txt):
Dies ist ein Beispiel-Text.
Zweite Zeile