[PHP] Listowanie katalogu

Zdjęcia, filmy, programy… zajmują dużo i są danymi binarnymi nieczytelnymi dla człowieka. Bazy danych zostały stworzone do przechowywania danych tekstowych – ich twórcy zaimpletowali mechanizmy pozwalające zapisać każdy typ danych jednakże w/w mechanizmy działają wolno. Ten oto prosty powód zmusza każdego programistę do nauki obsługi plików i katalogów.

W PHP obsługa systemu plików została maksymalnie uproszczona (co nie znaczy “okrojona”).

Istnieje kilka sposobów na zrealizowanie tego zadania. Jednym z najprostszych i najczęściej stosowanych jest funkcja opendir(). Ma ona jednak wady – jest wolna i często blokowana ze względu na bezpieczeństwo serwera.

KOD:

$katalog = ‘/home/grzegorz/Pulpit/pliki’;

$dir = opendir($katalog);

while(false!== ($file = readdir($dir)))

{

if(is_file(“$katalog/$file”))

{

echo $file. ‘
‘;

}

}

Nie zaleca się jej stosowania – zastąpiły ją iteratory dostępne od PHP5.

KOD:

$katalog = ‘/home/grzegorz/Pulpit/pliki’;

foreach(new DirectoryIterator($katalog) as $file)

{

if(!$file->isDot())

{

echo $file->getFilename() . ‘
‘;

}

}

Powyższy kod jest wygodny i prosty do zapamiętania. Ma on jednak jedną wadę – jeśli chcielibyśmy filtrować wyniki np. wg rozszerzenia należałoby użyć funkcji pathinfo() w każdym przejściu pętli a następnie sprawdzić w if`ie czy rozszerzenie ma się pojawić czy też nie.

KOD:

$katalog = ‘/home/grzegorz/Pulpit/pliki’;

$pokaz = array(“jpg”, “gif”, “bmp”, “png”, “psd”);

foreach(new DirectoryIterator($katalog) as $file)

{

if(!$file->isDot())

{

$f = $file->getFilename();

$pathinfo = pathinfo(“$katalog/”.$f);

if(in_array($pathinfo[‘extension’], $pokaz)

{

echo $f. ‘
‘;

}

}

}

Taki kod jest 100% poprawny jednakże długi i mało wydajny. Sprawę można uprościć używając funkcji glob() jak w poniższym przykładzie:

KOD:

$katalog = ‘/home/grzegorz/Pulpit/pliki’;

$pokaz = “{*.jpg,*.gif, *.bmp, *.png, *.psd}”;

foreach(glob($katalog.’/’.$pokaz, GLOB_BRACE) as $file)

{

if(is_file(“$katalog/$file”))

{

echo $file. ‘
‘;

}

}

Listę wyników możemy formatować również za pomocą html – najczęściej używana jest lista

    .

    KOD:

    $katalog = ‘/home/grzegorz/Pulpit/pliki’;

    $pokaz = “{*.jpg,*.gif, *.bmp, *.png, *.psd}”;

    echo “

      “;

      foreach(glob($katalog.’/’.$pokaz, GLOB_BRACE) as $file)

      {

      if(is_file(“$katalog/$file”))

      {

      echo “

    • $file
    • “;

      }

      }

      echo “

    “;

    Wszytkie kody zostały przetestowane jednakże w środowisku produkcyjnym mogą zachowywać się inaczej (np. ze względu na ograniczenia nałożone w php.ini) niż pokazano.