Rozdział 7. ♦ System plików 187
Rysunek 7.1.
Efekt działania skryptu
wyświetlającego zawartość wybranego katalogu serwera
ilsijsi
©
5* B!*i» W* ftMMł 4*S* tisreęffiM pcmot
■ : - - & t © 1 -
Itmpupl
404.html
download.php
downloads
do\vnloads.txt
httpd-2.0.52-3.i386.ipm
hltpd-2.0.52.lar.gz
httpd-devel-2.0.52-3.i386.tpm
imagel.jpg
index.html
index.php
MySQL-client-4.1.8-0.i386.rpm MySQL-devd-4.1.8-0.i386.rpm MySQL-server-4.1.8-0.i38d.rpm
Odczyt zawartości katalogu odbywa się w pętli whi 1 e. Wynik każdego wywołania funkcji readdi r (czyli nazwa każdego kolejnego elementu katalogu) jest przypisywany zmiennej file. Pętla kończy się, kiedy file będzie równe false. Należy zwrócić uwagę na to, że do stwierdzenia, czy file jest różne od false, jest wykorzystywany operator !— (a nie !=). Wykorzystanie operatora != mogłoby spowodować błędy wynikające z konwersji niektórych nazw plików na wartość false (por. rozdział 6., sekcja „Porównywanie ciągów”). Przykładowo, gdyby w przetwarzanym katalogu znajdował się plik
0 nazwie 0 (cyfra zero), po jego odczytaniu pętla zakończyłaby działanie, gdyż konwersja ciągu 0 na typ boolean daje w wyniku wartość false.
Warto również zwrócić uwagę, że pierwsze dwie pozycje na liście to . i .., które oznaczają katalog bieżący oraz katalog nadrzędny. Jeśli chcemy uniknąć ich wyświetlania, trzeba zastosować dodatkową instrukcję warunkową, np. umieszczoną wewnątrz pętli whi 1 e. Taka pętla mogłaby mieć np. następującą postać:
whi 1 e ((Sfile = readdir($fd)) 1— false){ ifdfile !- && Sfile != "...“)
echo("$file<br>\n"):
}
W PHP w wersji 5. została wprowadzona nowa funkcja o nazwie scandir, która za jednym wywołaniem potrafi pobrać zawartość wybranego katalogu i zwrócić ją w postaci tablicy. Co więcej, uzyskane nazwy plików i katalogów są automatycznie sortowane. Schematyczne wywołanie funkcji scandir ma postać: scandir('nazwa'[. sortowanie’])
gdzie nazwa określa katalog, a sortowanie — sposób sortowania wyników. Parametr sortowanie jest opcjonalny; jeżeli zostanie pominięty w wywołaniu, nazwy zostaną posortowane w porządku rosnącym, jeżeli natomiast parametr sortowanie będzie obecny
1 będzie miał wartość 1, nazwy zostaną posortowanie w porządku malejącym. Sposób wykorzystania funkcji scandir do pobrania i wyświetlania zawartości katalogu bieżącego przedstawia skrypt przedstawiony na listingu 7.2.