Rozdział 7. ♦ System plików 195
Funkcja listDir próbuje najpierw zmienić katalog bieżący na katalog przekazany jej w postaci argumentu. Jeśli nie zdoła tego uczynić, wyświetla komunikat o braku dostępu i kończy działanie. Jeśli katalog udało się zmienić, zmiennej di r jest przypisywany wynik działania funkcji getcwd, pobierającej aktualny katalog bieżący. Dzięki temu w dalszej części kodu będzie wykorzystywana bezwzględna nazwa katalogu. Jeśli zatem przekazany do skryptu argument miał postać /usr/tmp/abc/. ,/bcd/, zostanie on zamieniony w tym miejscu na /usr/tmp/bcd/ (zakładając, że w systemie plików serwera znajduje się katalog /usr/tmp/, a w nim podkatalogi o nazwach abc i bcd).
Kolejna instrukcja skryptu to otwarcie katalogu za pomocą funkcji opendir. W przypadku gdyby jej wywołanie zakończyło się niepowodzeniem, do przeglądarki jest wysyłany komunikat o braku dostępu do katalogu i skrypt kończy działanie. Po otwarciu katalogu ciąg zapisany w zmiennej di r zostaje przetworzony w taki sposób, aby w dalszej części skryptu miał jednolitą postać, niezależnie od tego, na jakim systemie został uruchomiony oraz jaki katalog został mu przekazany. Najpierw wszystkie znaki \ zostają zamienione na /, za co odpowiada funkcja str_replace. Następnie sprawdzane jest, czy na końcu ciągu znajduje się znak /. Jeśli tak, jest on usuwany, za co odpowiada wywołanie funkcji substr.
Ta ostatnia czynności jest potrzebna, gdyż w dalszej części skryptu nazwa katalogu bieżącego zapisana w zmiennej di r jest łączona z nazwami znajdujących się w tym katalogu podkatalogów. Pomiędzy te dwie nazwy wstawiony jest znak /. Gdyby w nazwie zapisanej w di r na końcu występowałby znak /, to po czynności łączenia w ciągu wynikowym znalazłyby się dwa znaki / występujące po sobie (np. //usr/tmp zamiast /usr/tmp).
Odczyt zawartości katalogu odbywa się w pętli whi le, w sposób analogiczny do przedstawionego w już prezentowanych przykładach. Nazwa każdego elementu jest zapisywana w zmiennej fi 1 e. Jeśli jest to plik (co jest sprawdzane za pomocą funkcji i s_fi 1 e), nazwa jest po prostu wyświetlana na ekranie. Jeśli jednak jest to katalog (co jest sprawdzane za pomocą funkcji i s_di r), jest konstruowany znacznik <a> w schematycznej postaci:
<a href="http://Ioca 1 host/index.php?dir=pe}najiazwa_katalogu"> nazwa_katalogu </a> przykładowo:
<a href='' http://localhost/index.php?dir-/usr/tmp/abc/"> abc </a>
Ten znacznik jest następnie również wysyłany do przeglądarki.
Jeżeli chcemy odczytać dane zawarte w pliku lub też zapisać jakieś dane w pliku, musimy najpierw go otworzyć. Czynność ta jest w PHP wykonywana za pomocą funkcji fopen. Jej schematyczne wywołanie ma postać:
fopen('nazwa'. 'tryb')