SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=217&group=38
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Lesen und Schreiben von Dateien


Um eine Datei zu öffnen, benötigen Sie die Funktion fopen(). Diese erwartet zwei Argumente:

Die Funktion liefert als Rückgabewert einen Verweis (Handle) auf die Datei. Diesen Verweis benötigen Sie für Lese- und Schreiboperationen, beispielsweise in Verbindung mit fread().

Beispiel

<?php

$datei = fopen("info.txt","r");
echo fread($datei,1000);
fclose($datei);

?>

oder

<?php

// Fehlermeldung wird unterdrückt und die eigene angezeigt
@$datei = fopen("info.txt","r") or die("Kann info.txt nicht öffnen!");
echo fread($datei,1000);
fclose($datei);

?>

Das Dateiattribut, welches sich im zweiten Argument der fopen()-Funktion befindet, ist "r" und stellt die Datei lediglich zum Lesen zur Verfügung.

In der folgenden Tabelle habe ich Ihnen die zur Verfügung stehenden Modi aufgelistet:

ModusBedeutung
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.


Sie sollten vor allem auf die Angaben »w« und »w+« achten. Damit sind Sie in der Lage, Dateien zu löschen oder zu erzeugen. Die Angabe »a« (append) sollten Sie verwenden, wenn Sie an eine bereits bestehende Datei weitere Daten anhängen wollen.

Die folgende Tabelle soll Ihnen die Entscheidung für den einen oder anderen Modus beim Verarbeiten von Dateien erleichtern:

ModusLesbar?Schreibbar?DateizeigerKürzen?Erzeugen?
rJaNeinAnfangNeinNein
r+JaJaAnfangNeinNein
wNeinJaAnfangJaJa
w+JaJaAnfangJaJa
aNeinJaEndeNeinJa
a+JaJaEndeNeinJa


Dateien von einem entfernten Server

Sollten Sie Dateien von einem entfernten Server öffnen wollen, zu dem Sie via HTTP oder FTP Zugang haben, dann können Sie hierfür ebenfalls fopen() einsetzen:

$datei = fopen("www.selfas.de/info.txt","r");

Um mithilfe von fopen() Dateien zu öffnen, die einen Benutzernamen und ein Passwort voraussetzen, platzieren Sie die Authentifizierungsinformationen wie folgt in die URL:

$datei = fopen("ftp://benutzername:passwort@ftp.selfas.de/pub/info.txt","r");
$datei = fopen("benutzername:passwort@www.selfas.de/info.txt","r");

Die Dateien werden mithilfe des URL-fopen-Wrapper übertragen. In der Standardkonfiguration ist dieser freigegeben, lässt sich jedoch durch die Option allow_url_fopen in Ihrer php.ini sperren. Wenn Sie Dateien auf einem entfernten Server nicht mit fopen() öffnen können, sollten Sie Ihre Serverkonfiguration überprüfen.{PSP}Einsatz von fgets()

Neben dem bereits vorgestellten fread() steht Ihnen zum Auslesen einer Datei auch noch fgets() zur Verfügung. Die beiden unterscheiden sich in einem wesentlichen Punkt: fread() liest immer so viele Zeichen, wie im zweiten Argument angegeben werden, fgets() liest nur bis zum nächsten Zeilenumbruch, auch wenn im zweiten Argument ein größerer Wert angegeben wurde.

Hinweis: fread() ignoriert beim Auslesen einer Datei die enthaltenen Zeilenumbrüche.


Beispiel – Inhalt von info.txt

Matthias
Caroline

Beispiel – auslesen.php mit fread()

<?php

$datei = fopen("info.txt","r");
echo fread($datei,1000);
fclose($datei);

?>

Ausgabe
Matthias
Caroline

Beispiel – auslesen.php mit fgets()

<?php

$datei = fopen("info.txt","r");
echo fgets($datei,1000);
fclose($datei);

?>

Ausgabe
Matthias

Und noch die folgende Variante:

<?php

$datei = fopen("info.txt","r");
echo fread($datei,1000);
echo fgets($datei,1000);
fclose($datei);

?>

Ausgabe
Matthias
Caroline

Das vorliegende Beispiel zeigt, wie die Funktionen arbeiten. Bei jedem Aufruf setzen sie den internen Dateizeiger an das Ende des eingelesenen Abschnitts. Bei fgets() ist das in der Regel eine Zeile. Sollte jedoch eine Zeile länger sein als im zweiten Argument angegeben, wird lediglich ein Teil der Zeile eingelesen. Sie sollten die Funktion fgets() in einer Schleife einsetzen, um nacheinander sämtliche Zeilen auszugeben. Die Ausgabe wird nun durch HTML-Angaben formatiert:

<?php

$datei = fopen("info.txt","r");
$zeile = true;
while ($zeile) {
  $zeile = fgets($datei, 100);
  echo "<b>$zeile<b><br>";
}
fclose($datei);

?>

Ausgabe
Matthias
Caroline
{PSP}Da fgets() ein Leerzeichen zurückgibt und dieses von der while-Schleife als false interpretiert wird, können Sie den Rückgabewert als Abbruchkriterium einsetzen. Die Schleife endet automatisch, wenn in der Datei keine weiteren Zeilen vorkommen.


Zählen von Zeilen und Absätzen

Die Funktion fgets() kann Ihnen auch dabei behilflich sein, eine Datei zu analysieren, wie beispielsweise die Anzahl der Zeilen oder Absätze zu ermitteln.

Beispiel – Ermitteln der Anzahl von Zeilen

<?php

$zeilen = 0;

if ($datei = fopen("daten.txt","r")) {
  while (!feof($datei)) {
    if (fgets($datei,1048576)) {
      $zeilen++;
    }
  }
}

echo $zeilen;

fclose($datei);

?>

Beispiel – Ermitteln der Anzahl von Absätzen

<?php

$absaetze = 0;

if ($datei = fopen("daten.txt","r")) {
  while (! feof($datei)) {
    $z = fgets($datei,1048576);
    if (("\n" == $z) || ("\r\n" == $z)) {
      $absaetze++;
    }
  }
}
echo $absaetze;

fclose($datei);

?>

Hinweis: Der Wert für das zweite Argument in fgets() wurde bewusst so hoch gesetzt, um möglichst sämtliche Zeichen pro Zeile zu erfassen.


Sonderfall Datensätze

Eine Datei, welche datensatzähnliche Strukturen wie Trennzeichen aufweist, kann ebenfalls auf diese Weise analysiert werden.

Inhalt der db.txt-Datei

Matthias Kannengiesser
-*-
Caroline Kannengiesser
-*-
Gülten Kannengiesser
-*-

Beispiel – Ermitteln der Anzahl von Datensätzen

<?php

$dsatz = 0;
$dsatz_trenner = '-*-';

if ($datei = fopen('db.txt','r')) {
  while (! feof($datei)) {
    $z = rtrim(fgets($datei,1048576));
    if ($z == $dsatz_trenner) {
      $dsatz++;
    }
  }
}

echo $dsatz;

fclose($datei);

?>
{PSP}Bearbeiten einzelner Wörter einer Datei

Um mithilfe der Funktion fgets() einzelne Wörter bearbeiten bzw. erfassen zu können, sollten Sie zusätzlich reguläre Ausdrücke mit der Funktion preg_split() verarbeiten.

Inhalt – daten.txt

Matthias ist dort
Caroline ist hier

Beispiel

<?php

$datei = fopen('daten.txt','r');
while (! feof($datei)) {
  if ($z = fgets($datei,1048576)) {
    // Zeile nach Wörtern durchsuchen
    $worte = preg_split('/\s+/',$z,-1, PREG_SPLIT_NO_EMPTY);
    // Alle Wörter einer Zeile bearbeiten
    foreach ($worte as $wort) {
      echo "<b>$wort</b><br>";
    }
    // Nächste Zeile (als Absatz)
    echo "<p>";
  }
}

fclose($datei);

?>

Ausgabe
Matthias
ist
dort

Caroline
ist
hier

Quelltext-Ausgabe

<b>Matthias</b><br><b>ist</b><br><b>dort</b><br>
<p><b>Caroline</b><br><b>ist</b><br><b>hier</b><br><p>


Der Code verwendet das Metazeichen \s der Perl-kompatiblen Regular Expression Engine. Hiermit werden Leerzeichen (Whitespaces) jeglicher Art verarbeitet, wie Leerzeichen, Tabulatoren, Zeilenvorschübe, Wagenrückläufe und Seitenvorschübe.