Um eine Datei zu öffnen, benötigen Sie die Funktion fopen(). Diese erwartet zwei Argumente:
- Name der Datei
- Dateiattribut
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:
Modus | Bedeutung | 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:
Modus | Lesbar? | Schreibbar? | Dateizeiger | Kürzen? | Erzeugen? | r | Ja | Nein | Anfang | Nein | Nein | r+ | Ja | Ja | Anfang | Nein | Nein | w | Nein | Ja | Anfang | Ja | Ja | w+ | Ja | Ja | Anfang | Ja | Ja | a | Nein | Ja | Ende | Nein | Ja | a+ | Ja | Ja | Ende | Nein | Ja |
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.
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
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);
?>
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.
|