ftell()
Die PHP-Funktion ftell() gibt die aktuelle Position des Dateizeigers zurück. Erfahren Sie Syntax, Beispiele und häufige Fallstricke.
Was ist die ftell()-Funktion?
Die ftell()-Funktion ist eine eingebaute PHP-Funktion, die die aktuelle Position des Dateizeigers zurückgibt — den Byte-Offset, gezählt vom Anfang der Datei, an dem der nächste Lese- oder Schreibvorgang stattfinden wird. Jedes geöffnete Datei-Handle besitzt einen internen Cursor; fread(), fwrite() und fgets() rücken ihn vor, während fseek() und rewind() ihn explizit verschieben. ftell() meldet lediglich, wo sich dieser Cursor aktuell befindet, ohne ihn zu verändern.
Die Kenntnis des Offsets ist nützlich, wenn Sie festhalten möchten, an welcher Stelle einer Datei Sie sich befinden (um später mit fseek() weitermachen zu können), wenn Sie messen wollen, wie viele Bytes Sie bisher verarbeitet haben, oder wenn Sie das Ende eines Datensatzes in einer Datei mit fester Breite oder einer Binärdatei erkennen müssen.
Diese Seite behandelt die Syntax, ein ausführbares Beispiel, den Rückgabewert von ftell(), häufige Fallstricke (Anhängemodus, Streams) und das Verhältnis zu anderen Dateizeiger-Funktionen.
Syntax
ftell(resource $stream): int|false$stream muss ein Dateihandle sein, das von fopen() zurückgegeben wird (oder von einer Funktion wie fsockopen()). Die Funktion gibt die Position als ganzzahligen Byte-Offset zurück oder false bei einem Fehler — zum Beispiel, wenn der Stream nicht seekbar ist. Da 0 (der Anfang der Datei) ein gültiger, „falsy" Wert ist, sollten Sie den Rückgabewert immer mit === prüfen:
$pos = ftell($file);
if ($pos === false) {
// could not determine the position
}Verwendung der ftell()-Funktion
Der typische Ablauf ist:
- Öffnen Sie die Datei mit
fopen()im benötigten Modus. - Lesen Sie aus der Datei oder schreiben Sie in sie, damit der Zeiger sich bewegt.
- Rufen Sie
ftell()mit dem Dateihandle auf, um dessen Position zu lesen. - Verwenden Sie diesen Offset — speichern Sie ihn beispielsweise oder übergeben Sie ihn an
fseek(). - Schließen Sie die Datei mit
fclose().
Das folgende Beispiel ist vollständig eigenständig: Es schreibt zuerst eine temporäre Datei, sodass Sie es ohne vorherige Datenvorbereitung ausführen können.
<?php
// Create a temporary file with known contents.
$filename = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($filename, 'Hello, World! This is a test.');
$file = fopen($filename, 'r');
echo "Start position: " . ftell($file) . "\n"; // 0
fread($file, 5); // read "Hello"
echo "After reading 5 bytes: " . ftell($file) . "\n"; // 5
fread($file, 5); // read ", Wor"
echo "After reading 5 more: " . ftell($file) . "\n"; // 10
rewind($file); // jump back to the start
echo "After rewind: " . ftell($file) . "\n"; // 0
fseek($file, 7); // jump to byte 7
echo "After fseek to 7: " . ftell($file) . "\n"; // 7
echo "Next 5 bytes: " . fread($file, 5) . "\n"; // "World"
fclose($file);
unlink($filename);Ausgabe:
Start position: 0
After reading 5 bytes: 5
After reading 5 more: 10
After rewind: 0
After fseek to 7: 7
Next 5 bytes: WorldJedes fread() rückt den Zeiger um die tatsächlich gelesenen Bytes vor, sodass ftell() von 0 auf 5 und dann auf 10 anwächst. rewind() setzt ihn auf 0 zurück, und fseek($file, 7) verschiebt ihn direkt auf Byte 7, wo das Wort World beginnt.
Anhängemodus: Ein häufiger Fallstrick
Wenn eine Datei im Anhängemodus ('a' oder 'a+') geöffnet wird, gehen alle Schreibvorgänge ans Ende der Datei, unabhängig davon, wo sich der Zeiger befindet. ftell() kann direkt nach dem Öffnen 0 melden, obwohl Schreibvorgänge ans Ende gehen — der Rückgabewert beschreibt im Anhängemodus nicht zuverlässig, wo der nächste Schreibvorgang stattfindet. Wenn Sie präzise Positionen benötigen, öffnen Sie die Datei mit 'r+', 'w+' oder 'c+' und setzen Sie den Zeiger explizit mit fseek().
Ebenso können nicht-seekbare Streams (wie manche Netzwerk- oder Pipe-Streams) keine sinnvolle Position melden, und ftell() gibt für diese false zurück.
Verwandte Funktionen
ftell() arbeitet selten allein. Es ist Teil einer kleinen Familie von Dateizeiger-Funktionen:
fopen()— öffnet eine Datei und liefert das Handle, dessen Positionftell()ausliest.fread()— liest Bytes und rückt den Zeiger vor.fwrite()— schreibt Bytes und rückt den Zeiger vor.fseek()— verschiebt den Zeiger auf eine absolute oder relative Position; zusammen mitftell()können Offsets gespeichert und wiederhergestellt werden.rewind()— setzt den Zeiger auf den Anfang zurück (entsprichtfseek($file, 0)).fclose()— schließt die Datei, wenn Sie fertig sind.
Für einen umfassenderen Überblick siehe PHP File Handling.
Fazit
Die ftell()-Funktion meldet den aktuellen Byte-Offset eines Dateizeigers, ohne ihn zu verschieben, was sie zum natürlichen Begleiter von fseek() und rewind() beim Navigieren in Dateien macht. Denken Sie daran, das Ergebnis mit === false zu vergleichen (da 0 ein gültiger Offset ist), und beachten Sie, dass der Anhängemodus und nicht-seekbare Streams keine zuverlässigen Positionen zurückgeben.