Katalogi… niby to proste, a wiele osób ma z tym problemu. W tym krótkim artykule przedstawiam wszystko co jest potrzebne do efektywnej pracy z katalogami.
Ostatnio spotykałem się z wieloma problemami dotyczącymi obsługi katalogów w PHP. Nie bez przyczyny, jest to dość delikatny temat, ale oczywiście nie trudny … trzeba tylko załapać. Nie będę tutaj mówił o uprawnieniach, od tego jest oddzielny artykuł, także dobrze go sobie najpierw przestudiować.
Na samym początku, kilka ważnych szczegółów:
– nie istnieje w tym wypadku pojęcie typu FOLDER, nauczcie się mówić KATALOG
– katalog, jest „wyjątkowym” rodzajem pliku, który grupuje pliki, i w pewnym zakresie jest traktowany jak one
– na unix’owych serwerach ścieżki dostępu podaje się stosując „/” a nie jak w windowsie „\”
– bardzo ważna jest umiejętność posługiwania się uprawnieniami w unixie
Tworzenie i usuwanie katalogów:
Te czynności są akurat bardzo proste, należy tylko pamiętać, że skrypt domyślnie ma uprawnienia równe z administratorem (twórcą skryptu). Jest to dość wygodne, ale na te uprawnienia mają wpływ użytkownicy skryptu. Katalogi tworzymy poprzez polecenie mkdir(), podając kolejno jako parametry nazwę katalogu (może to być ścieżka dostępu), oraz uprawnienia z jakimi ma być utworzony. z usuwaniem katalogu jest już większy problem, otóż nie można usunąć nie pustego katalogu, tzn. zawierającego w sobie pliki. Trzeba je najpierw usunąć. Do usuwania katalogu używamy polecenia rmdir(), a jako parametr podajemy nazwę katalogu (lub ścieżkę dostępu). Oto przykładowa funkcja usuwająca drzewo katalogów:
| <?php function deltree( $dirPath ) { $dirDP = opendir( $dirPath ); while( $element = readdir( $dirDP ) ) { if ($element!=’.’ and $element!=’..’) { if ( is_file( $dirPath . „/” . $element ) ) { unlink( $dirPath . „/” . $element ); } else { $this -> deltree( $dirPath . „/” . $element ); } } } closedir($dirDP); rmdir( $dirPath ); } ?> |
Działa ona na zasadzie rekurencji i można jej używać, ale uwaga na uprawnienia!
Praca z katalogiem:
W tym wypadku rzeczy się maja podobnie do plików. Aby korzystać z katalogu, trzeba utworzyć strumień dostępu. Katalogi posiadają swoje wewnętrzne wskaźniki, wskazujące pozycję. Strumień katalogu tworzymy przy pomocy polecenia opendir(), jako parametr podając nazwę (lub ścieżkę dostępu) katalogu. Analogicznie strumień zamykamy używając closedir(), a jako parametr podajemy uchwyt do katalogu.
Odczytywanie katalogu:
Naturalnie odczytywanymi pozycjami z katalogu są pliki. Ale UWAGA nie tylko, są w każdym katalogu dwie pozycje, które nie są plikami, są to: „.” oraz „..”. Pozycja „.” oznacza bieżący katalog, a „..” katalog nadrzędny. Podobnie jak np. w Norton Commanderze. Odczytanie kolejnego elementu z katalogu odbywa się poprzez polecenie: readdir() podając jako parametr uchwyt do katalogu. Z bieżącego katalogu zostaje zwrócona kolejna pozycja, a wskaźnik zostaje przesunięty do kolejnej. Jeżeli odczytujemy dane z katalogu, możemy użyć do tego pętli, trzeba jednak pamiętać o „.” i „..”, które trzeba pominąć w warunku, przykładowy skrypt może wyglądać tak:
| <?php $dirPath = „./news/newsy”; $dirDP=opendir( $dirPath ); while( $element = readdir( $dirDP ) ) { if ( $element != ’.’ and $element != ’..’ ) { $elementy[] = $element; } } closedir( $dir_news ); ?> |
W ten oto sposób możemy odczytać wszystkie elementy z podanego katalogu, łącznie z katalogami. Jeżeli chcielibyśmy nie odczytywać katalogów, trzeba by użyć w warunku wyrażenia isdir(), i jako argument podać ścieżkę dostępu (UWAGA ścieżkę dostępu, a nie nazwę), można by do tego użyć zmiennej $dirPath, łącząc jej zawartość z wartością $element, wówczas wyglądałoby to tak:
| <?php $dirPath = „./news/newsy”; $dirDP=opendir( $dirPath ); while( $element = readdir( $dirDP ) ) { if ( $element != ’.’ and $element != ’..’ and !isdir( $dirPath . $element ) ) { $elementy[] = $element; } } closedir( $dir_news ); ?> |
W powyższym skrypcie w wyniku nie będzie katalogów, jeżeli pominiemy negacje funkcji isdir() wówczas w wyniku będą tylko katalogi…
Wskaźnik wewnętrzny katalogu:
Jeśli chodzi o wewnętrzny wskaźnik katalogu, to dużego pola do popisu nie ma, można tylko przewinąć go do początku, używając funkcji rewinddir(), i jako parametr podając uchwyt do katalogu. Funkcja nie zwraca żadnych wartości.
Inne operacje na katalogach:
Jak wspomniałem na początku, katalogi mają dużo wspólnego z plikami, przez co niektórych funkcji używa się taki sam sposób, np.: copy() lub fstat(), te funkcję są opisane w artykule o plikach, zapraszam do lektury.
