opendir / readdir / closedir în PHP

Deschide un director pentru a-i citi intrările una câte una, cu readdir, apoi îl închide cu closedir.

Sintaxă
opendir(string $directory, $context = null)

Ce face opendir / readdir / closedir

opendir deschide un director și returnează un „mâner” (o resursă). readdir citește la fiecare apel următoarea intrare, iar când nu mai sunt intrări returnează false. La final, closedir eliberează resursa.

Spre deosebire de scandir, intrările nu sunt sortate și nu se încarcă toate în memorie deodată. Este util pentru directoare cu foarte multe fișiere.

Parametri

Parametru Descriere
$directory Directorul deschis.
$context Opțional. Un context de stream.

Ce returnează

opendir: o resursă de director sau false. readdir: numele intrării următoare sau false la final.

Exemple

Exemplul 1: Citirea tuturor intrărilor

Ordinea din readdir depinde de sistemul de fișiere, așa că sortăm la final.

<?php
mkdir("muzica");
touch("muzica/melodie1.mp3");
touch("muzica/melodie2.mp3");

$director = opendir("muzica");
$nume = [];
while (($intrare = readdir($director)) !== false) {
    if ($intrare !== "." && $intrare !== "..") {
        $nume[] = $intrare;
    }
}
closedir($director);

sort($nume);
print_r($nume);

Rezultat

Array
(
    [0] => melodie1.mp3
    [1] => melodie2.mp3
)

Exemplul 2: De ce se scrie !== false

Un fișier numit 0 este considerat fals într-o condiție simplă, iar bucla greșită se oprește când ajunge la el.

<?php
mkdir("date");
touch("date/0");
touch("date/a.txt");

$d = opendir("date");
$corect = 0;
while (($x = readdir($d)) !== false) {
    $corect++;
}

rewinddir($d);
$gresit = 0;
while ($x = readdir($d)) {
    $gresit++;
}
closedir($d);

echo "Cu !== false: $corect intrări\n";
echo "Fără: $gresit intrări";

Rezultat

Cu !== false: 4 intrări
Fără: 2 intrări

Greșeli frecvente

  • Scrii while ($f = readdir($d)). Bucla se oprește la un fișier numit 0. Compară mereu cu !== false.
  • Te aștepți ca readdir să dea numele în ordine alfabetică. Ordinea este a sistemului de fișiere. Pentru listă sortată folosește scandir.

Comenzi înrudite

  • scandir: Returnează lista fișierelor și directoarelor dintr-un director, sortată alfabetic.
  • glob: Găsește fișierele ale căror căi se potrivesc cu un tipar, de exemplu poze/*.jpg.
  • is_dir: Verifică dacă o cale indică un director existent.