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 numit0. Compară mereu cu!== false. - Te aștepți ca
readdirsă dea numele în ordine alfabetică. Ordinea este a sistemului de fișiere. Pentru listă sortată foloseștescandir.