W3docs

rewinddir()

Erfahren Sie, wie PHP's rewinddir() den internen Zeiger eines Verzeichnis-Streams zurücksetzt, damit Sie den Inhalt ohne erneutes Öffnen neu einlesen können.

Wenn Sie in PHP ein Verzeichnis lesen, verfolgt ein interner Zeiger, wie weit Sie gekommen sind. Sobald Sie das Ende erreicht haben, bleibt dieser Zeiger dort stehen — rufen Sie readdir() erneut auf, erhalten Sie false ohne weitere Einträge. rewinddir() setzt den Zeiger wieder auf den ersten Eintrag zurück, sodass Sie das Verzeichnis ein zweites Mal lesen können, ohne es erneut zu öffnen. Diese Seite behandelt, was die Funktion tut, ihre Syntax, ein funktionierendes Mehrfachdurchlauf-Beispiel, häufige Fallstricke sowie wann (und wann nicht) sie eingesetzt werden sollte.

Syntax

rewinddir(?resource $dir_handle = null): void
  • $dir_handle — ein Verzeichnis-Handle, das zuvor von opendir() zurückgegeben wurde. Wenn weggelassen, verwendet PHP das Handle des zuletzt aufgerufenen opendir().
  • Rückgabewertrewinddir() gibt void zurück (in älteren PHP-Versionen null). Es signalisiert weder Erfolg noch Misserfolg; wenn Sie ein ungültiges Handle übergeben, löst PHP stattdessen einen TypeError oder eine Warnung aus.

Es wird fast immer zusammen mit opendir(), readdir() und closedir() verwendet.

Wie rewinddir() funktioniert

Ein Verzeichnis-Handle verhält sich wie ein Cursor über die Einträge des Verzeichnisses. readdir() bewegt diesen Cursor bei jedem Aufruf um einen Eintrag weiter und gibt false zurück, wenn keine Einträge mehr vorhanden sind. rewinddir() positioniert den Cursor einfach wieder am Anfang, sodass das nächste readdir() beim ersten Eintrag neu beginnt.

Ein Verzeichnis zweimal lesen

Dies ist der typische Anwendungsfall: ein Verzeichnis auflisten und es dann aus demselben Handle erneut auflisten. Beachten Sie, wie readdir($h) beim zweiten Durchlauf keine Einträge zurückgibt, bis rewinddir() aufgerufen wird.

<?php
$h = opendir(__DIR__);
if ($h === false) {
    die("Failed to open directory\n");
}

echo "First pass:\n";
while (($file = readdir($h)) !== false) {
    echo "  $file\n";
}

// Without rewinddir(), this loop would print nothing.
rewinddir($h);

echo "Second pass:\n";
while (($file = readdir($h)) !== false) {
    echo "  $file\n";
}

closedir($h);
?>

Beide Durchläufe geben dieselbe Menge an Einträgen aus (einschließlich der Pseudo-Verzeichnisse . und .., die readdir() immer zurückgibt).

Ein häufiger Fallstrick: die strikte false-Prüfung

Vergleichen Sie das Ergebnis von readdir() stets mit !== false, nicht nur mit != oder einer Wahrheitsprüfung. Ein Verzeichnis kann legitimerweise einen Eintrag namens "0" enthalten, der in PHP falsy ist — eine lockere Prüfung würde die Schleife vorzeitig beenden und Dateien stillschweigend überspringen.

<?php
// Wrong: stops as soon as it hits a file named "0" (or an empty name)
while ($file = readdir($h)) { /* ... */ }

// Correct: only stops at the genuine end of the stream
while (($file = readdir($h)) !== false) { /* ... */ }
?>

Wann rewinddir() verwenden — und wann nicht

Verwenden Sie rewinddir(), wenn Sie mehr als einen Durchlauf über dasselbe offene Handle benötigen, zum Beispiel um im ersten Durchlauf eine Gesamtmenge zu berechnen (Dateien zählen, Größen summieren) und im zweiten Durchlauf auf jeden Eintrag zu reagieren. Es ist günstiger als closedir() und erneutes opendir() aufzurufen, da das erneute Öffnen des zugrunde liegenden Dateideskriptors vermieden wird.

Wenn Sie die Einträge nur einmal benötigen oder sie sortiert haben möchten, bevorzugen Sie scandir(), das die gesamte Auflistung in einem einzigen Aufruf als Array zurückgibt — kein Zeiger zum Verwalten. Einen Überblick über alle Verzeichnisfunktionen finden Sie im Kapitel PHP Directory.

Fazit

rewinddir() setzt den internen Zeiger eines Verzeichnis-Streams auf den Anfang zurück und ermöglicht so das erneute Lesen des Verzeichnisses ohne den Overhead des Schließens und Wiederöffnens des Handles. In Kombination mit opendir(), readdir() und closedir() macht es den mehrfachen Verzeichnisdurchlauf einfach und effizient. Greifen Sie stattdessen auf scandir() zurück, wenn eine einzelne sortierte Auflistung alles ist, was Sie benötigen.

graph TD
    A[opendir] --> B[readdir]
    B --> C{More items?}
    C -->|Yes| B
    C -->|No| D[rewinddir]
    D --> B
    B --> E[closedir]

Übungen

Übung
Was ist die Hauptfunktion der Funktion 'rewinddir()' in PHP?
Was ist die Hauptfunktion der Funktion 'rewinddir()' in PHP?
Was this page helpful?