Programowanie w języku PHP » FAQ

Lista plików z katalogu

  • 2007-12-05 14:59
  • 9 komentarzy
  • 15916 odsłon
  • Oceń ten tekst jako pierwszy
Jak pobrać listę plików z katalogu? Jest kilka sposobów:

1) Korzystając z funkcji opendir i readdir:

$dir = opendir('katalog');
while(false !== ($file = readdir($dir)))
  if($file != '.' && $file != '..') 
    echo $file . '<br />';

2) Używając iteratorów (PHP5):

foreach(new DirectoryIterator('katalog') as $file)
  if(!$file->isDot())
    echo $file->getFilename() . '<br />';


Iteratory to nowość w PHP5. Można je definiować samemu, lub skorzystać z gotowych, które poza operacjami na katalogach ułatwiają prace z tablicami i plikami XML. Więcej informacji w Podręczniku PHP.

3) Wykorzystując klasę dir:

$dir = dir('katalog');
while($file = $dir->read())
  if($file != '.' && $file != '..') 
    echo $file . '<br />';
$dir->close();

4) Korzystając z funkcji scandir:

foreach(scandir('katalog') as $file)
  if($file != '.' && $file != '..')
    echo $file . '<br />';

5) Za pomocą funkcji glob:

foreach(glob('*', GLOB_BRACE) as $file)
  if($file != '.' && $file != '..') 
    echo $file . '<br />';

Powyższy kod wyświetli pliki z obecnego katalogu. Aby pobrać je z folderu "katalog" należy:

foreach(glob('katalog/*', GLOB_BRACE) as $file)

Można też wybrać pliki o określonych rozszerzeniach (poniższy przykład dla plików *.jpg i *.gif):

foreach(glob('katalog/{*.jpg,*.gif}', GLOB_BRACE) as $file)

9 komentarzy

Beat87 2011-01-04 16:22

Jest jakaś możliwość żeby którakolwiek z tych metod otwierała folder znajdujący się na innym serwerze, lub na dysku lokalnym?

SebaZ 2010-03-07 00:30

Stare te komentarze poniżej, ale odpisze na nie, bo właśnie tym się zajmuje i ten artykuł mi się przydał.

@Format - nie widzi .htaccess, bo jest ukryty zapewne

@WIktorDelphi - nie jest różnica znacząca na tyle, żeby się nad tym zastanawiać, ale chodzi o to, że to OOP z PHP5. Użyj jakiejś pętli, zamiast metody pobierającej następny element, a będzie szybciej.

WIktorDelphi 2007-03-11 07:10

Dzięki za test, ale zastanawia mnie dlaczego metoda iteratorow trwa dlużej niż opendir?

Kooba 2007-01-31 20:44

Czyli wszystko tylko nie glob? :P

Format 2007-01-31 01:01

bardzo przyjemny artykuł.
Zrobiłem mały benchmark i wstępnie powiem jedynie, że funkcja glob zwraca "katalog/nazwapliku" zamiast "nazwapliku", tak jak robiły to inne metody.
Teraz tak:
- Użyłem 772 pliki i 9 katalogów
- Apache/2.2.3 (Win32) PHP/5.1.6
- Moja machina to Duron 900, 384 MB Ramu.
- Testy przeprowadzałem w Firefoxie
- wyniki podaje w formacie:
numer_metody)czas1/czas2/czas3

1)0.018 s./0.016 s./0.016 s.
2)0.020 s./0.020 s./0.019 s.
3)0.018 s./0.018 s./0.018 s.
4)0.019 s./0.018 s./0.018 s.
5)0.199 s./0.128 s./0.195 s.

Sami sobie to zinterpretujcie :)

ps. Zauważyłem, że scandir (4. metoda) podaje pliki w odrobinę innej kolejności co pozostałe, natomiast glob (5) nie wypisał mi pliku .htaccess

Jojersztajner 2006-09-02 17:46

?false !==? ???
(poprawiłem)

// no tak, mea kupa [wstyd]
<quote=http://pl.php.net/readdir>Please note the fashion in which readdir()'s return value is checked in the examples below. We are explicitly testing whether the return value is identical to (equal to and of the same type as--see Comparison Operators for more information) FALSE since otherwise, any directory entry whose name evaluates to FALSE will stop the loop (e.g. a directory named "0").</quote>

Marooned 2006-09-01 23:28

haha, wlasnie w TEJ chwili nad tym pracuje ale nieco bardziej funkcjonalne
kod napisany przez jakiegos goscia, przerobiony przez flabre, kolorki by ovo i teraz ja w tym grzebie :)

Marooned 2006-09-03 04:46

Jojersztajner - jesli nie masz pewnosci to nie zmieniaj artow, bo z dobrego kodu zrobiles bledny.
Dowod? Poczytaj dokumentacje - to, co zmieniles jest wytluszczone w uwadze do tej funkncji.
Cofnalem zmiany.

Coldpeer 2006-09-02 21:31

jojersztajner: tak, ten kod był dobry...