Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Katalogi/pliki
Forum PHP.pl > Forum > Przedszkole
desavil
Cześć.
W jaki sposób mogę uzyskać listę plików i katalogów w danym katalogu?
Pytanie może brzmi dosyć dziwnie, ale wyjaśnię o co chodzi.

Mam dajmy na to katalog o nazwie (to jego zawartość ma być wyświetlana): dir
W tym katalogu mam pliki z rozszerzeniem .txt oraz inne katalogi i w nich również znajdują się pliki .txt oraz inne katalogi.
W jaki sposób mogę uzyskać listę tych katalogów oraz ich zawartość? Jeżeli chodzi o zawartość, chodzi mi o wyświetlanie tylko konkretnych typów plików.

Czyli np. skrypt wyświetli mi w ten sposób:
Cytat
dir/plik1.txt
dir/plik2.txt
dir/dir2/plik1.txt
dir/dir2/dir3/plik1.txt
dir/dir3/plik.txt
itd..

Ma wyświetlać tylko pliki określone w skrypcie formaty ich.

Pozdrawiam, i dziękuję za pomoc.
Daiquiri
Skorzystaj z chociażby opendir czy readdir i w zależności od potrzeb schodź niżej w hierarchii. Pobranie rozszerzenia zależy od sposobu listowania, ale możesz wykorzystać nawet explode dla nazwy pliku.
desavil
To to wiem.. :/
Daiquiri
No to w czym masz problem?
desavil
Z napisaniem tego, na takiej zasadzie jak opisałem. tongue.gif
mortus
Trzeba sobie funkcję napisać, która będzie rekurencyjnie przeszukiwać katalog w poszukiwaniu plików danego typu, a jeśli znajdzie podkatalog, to wykona to samo dla tego podkatalogu. Użyłbym tutaj funkcji glob.
desavil
Nom próbuję, ale nie umiem tego zrobić, a bardzo tego potrzebuję tongue.gif
Byłbym wdzięczny gdyby koś udzielił mi konkretnej pomocy.

Funkcją glob zrobiłem takie coś:
  1. foreach(glob('katalog/{*.txt}', GLOB_BRACE) as $file)
  2. echo $file;

Ale to wyświetla tylko pliki znajdujące się w katalogu głównym (katalog).
Chciałbym, aby wyświetlało również zawartości podkatalogów oraz podkatalogów w podkatalogach aż do końca.
Nie mam pomysłu jak takie coś uzyskać :/

sad.gif
ber32
Może to pomoże?

  1. $katalogi = glob("*.txt");
  2. if(count($katalogi) > 0)
  3. {
  4. foreach($katalogi as $wypisz)
  5. {
  6. // raz dwa trzy
  7. echo $wypisz;
  8. }
  9. }
desavil
@up
no chyba nie :/
To co podałeś wgl. nie działa, i nie ma nawet ścieżki do katalogu.
ber32
Spróbuj zrobić z tego co ci napisaliśmy funkcje używając opendir i glob
Np.
  1.  
  2. function katalogi($katalogi){
  3.  
  4. /// tu kod
  5. }
desavil
ber32, chyba mylisz pojęcia i nie wiesz co do czego służy.
Tak samo z pierwszą Twoją wypowiedzią. Wzięty pierwszy lepszy przykład z manuala, nawet nie sprawdzony przez Ciebie.
ber32
Dokładnie z manuala
bo tam jest odpowiedz

Może troche namieszałem "Przepraszam"

A co ty proponujesz
mortus
Panie, to są przecież podstawy podstaw. Radzę się douczyć (poczytaj o rekurencji).
Rozwiązanie:
  1. <?php
  2. function search_dir($path, $file_type) {
  3. $files = glob($path.DIRECTORY_SEPARATOR.'*');
  4. foreach($files as $file) {
  5. if($file != '.' && $file != '..') {
  6. if(is_dir($file)) {
  7. search_dir($file, $file_type);
  8. }
  9. if(pathinfo($file, PATHINFO_EXTENSION) == $file_type) {
  10. echo $file.'<br />';
  11. }
  12. }
  13. }
  14. }
  15. // przykład
  16. search_dir('.', 'txt');
  17. ?>


@down: Pogrubiłem to co najważniejsze.
desavil
Dzięki, za konkretną i oczekiwaną prze-zemnie odpowiedź :]

@edit

Chciałbym w tym kodzie jeszcze uzyskać, aby zamiast echo było return.
Próbowałem to zamienić, ale nie chce coś działać.
mortus
To trzeba zapisywać listę plików do tablicy (trochę zabawy jest, bo trzeba pamiętać o rekurencji) i zwrócić tablicę.
  1. <?php
  2. function search_dir($path, $file_type) {
  3. $return = array();
  4. $files = glob($path.DIRECTORY_SEPARATOR.'*');
  5. foreach($files as $file) {
  6. if($file != '.' && $file != '..') {
  7. if(is_dir($file)) {
  8. $return = array_merge($return, search_dir($file, $file_type));
  9. }
  10. if(pathinfo($file, PATHINFO_EXTENSION) == $file_type) {
  11. $return[] = $file;
  12. }
  13. }
  14. }
  15. return $return;
  16. }
  17. // przykład
  18. $files = search_dir('tmp', 'txt');
  19. echo implode("<br />", $files);
  20. ?>
desavil
I ostatnią rzecz jaką chciałbym w tym skrypcie jeszcze uzyskać to wyświetlenie samych nazw katalogów (bez plików).
Wszystko tak samo, tylko bez plików, nazwy katalogów same.

Czyli jak mam strukturę katalogów taką:
Cytat
/dir/katalog
/dir/katalog/dir1
/dir/katalog_a
/dir/cos/a


To wyświetli mi to w taki sam sposób ze ścieżką tak jak w przypadku powyżej tylko bez plików.

smile.gif
Daiquiri
Teraz to już chyba żartujesz. Zamykam, to nie jest dział "napiszemy wszystko za Ciebie".

Zapomniałabym: jeżeli czekasz na gotowe rozwiązanie - napisz, a przeniosę temat do działu giełda.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.