Jak wylistować wszystkie pliki w katalogu?

Coldpeer

Jest kilka sposobów na wylistowanie plików i podkatalogów w folderze.

  1. Korzystając z funkcji opendir() i readdir():
$dir = opendir('katalog');
while (false !== ($file = readdir($dir)))
  if ($file !== '.' && $file !== '..') 
    echo $file . '<br />';
  1. Używając iteratorów:
foreach (new DirectoryIterator('katalog') as $file)
    if (!$file->isDot())
      echo $file->getFilename() . ',';
  1. Wykorzystując klasę Directory, z pomocją dir():
$dir = dir('katalog');
while ($file = $dir->read())
    if ($file !== '.' && $file !== '..') 
      echo $file . '<br />';
$dir->close();
  1. Korzystając z funkcji scandir():
foreach(scandir('katalog') as $file)
    if ($file !== '.' && $file !== '..')
      echo $file . '<br />';
  1. 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

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

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.

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

Czyli wszystko tylko nie glob? :P

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

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

// no tak, mea kupa [wstyd]

http://pl.php.net/readdir napisał(a)

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").

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 :)

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.

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