Pokud si chcete otevřít nějakou webovou stránku, zadáváte prohlížeči obvykle pouze adresu serveru a vynecháváte index.htm(l) nebo index.php. Pokud ale server žádný indexový soubor nenalezne, vygeneruje často obsah adresáře zadaného v URL. Většina serverů je však nakonfigurována tak, aby v podobném případě vypisovala hlášení o chybě „Nepovolený přístup/Access Forbidden“. Pokud toto nastavení nemůžete ovlivnit a chcete jej obejít, nabízí se snadné řešení v PHP.

Podobná věc se může hodit také v případě, že si na svůj webový prostor odkládáte i jiná data, která nejsou součástí vaší prezentace. Pokud totiž server nevypisuje obsah adresáře a vy chcete k datům přistupovat, nezbývá, než si pamatovat názvy oněch souborů, což není zrovna praktické. Pokud však vložíte do daného adresáře soubor s následujícím obsahem, pojmenovaný například index.php (nebo jiným příhodným jménem, pokud se k výpisu obsahu adresáře nemají dostat ostatní uživatelé), máte o starost méně.

<html>
<head>
 <title>Index Page</title>
</head>
<body>
<?php
if ($handle=opendir(‚.‘)) {
   while ($file = readdir($handle))
   {
      $polozky[count($polozky)] = $file;
   }
   closedir($handle);
   sort($polozky);
}
reset($polozky);
while (list($key, $val) = each($polozky))
{
   if ($val != „.“ && $val != „..“)
   {
      if (is_dir($val))
      {
         echo „(DIR) „;
         echo „<a href=\“$val\“>$val</a><br>\n“;
      }
   }
}
echo „<br>\n“;
reset($polozky);
while (list($key, $val) = each($polozky))
{
   if ($val != „.“ && $val != „..“)
   {
      if (!is_dir($val))
      {
         echo „<a href=\“$val\“>$val</a><br>\n“;
      }
   }
}
?>
</body>
</html>

Činnost skriptu je zřejmá. Nejprve se do pole načtou všechny položky v daném adresáři, které se pak setřídí podle abecedy. V prvním cyklu se vypisují adresáře, v druhém cyklu soubory. Položky se vypisují jako odkazy.

Na obtíž je nutnost vkládat tento soubor do každého adresáře, který chcete zpřístupnit. Pokud chcete vypsat soubory v celém adresářovém stromu, je třeba výše uvedený kód upravit. Definuje se jako funkce GetDirArray() a ta se pak rekurzívně volá. Soubor lze pojmenovat například tree.php.

<html>
<head>
 <title>Index Page</title>
</head>
<body>
<?php
function GetDirArray($sPath,&$ret,&$dir)
{
   global $time0, $MAXTIME, $timeover;
   if ((time()-$time0)>$MAXTIME) { $timeover = 1; return; }
   $handle=opendir($sPath);
   while ($file = readdir($handle))
   {
      $polozky[count($polozky)] = $file;
   }
   closedir($handle);
   sort($polozky);

   while (list($key, $val) = each($polozky))
   {
      if ($val != „.“ && $val != „..“)
      {
         $path = str_replace(„//“,“/“,$sPath.$val);
         $path2 = substr($path,2);
         $ret[count($ret)] = $path2;
         if (is_dir($sPath.“/“.$val))
         {
            $dir[count($dir)] = 1;
            GetDirArray($sPath.“/“.$val.“/“,$ret,$dir);
         }
         else
         {
            $dir[count($dir)] = 0;
         }
      }
   }
}
$MAXTIME = 60;
$time0 = time();
$timeover = 0;
$cwd = getcwd();
echo „<H1>Adresar \“$cwd\“</H1><br>\n“;
GetDirArray(„./“,$ret,$dir);
if ($timeover)
{
   echo „Provadeni skriptu preruseno,“;
   echo „uplynul maximalni povoleny cas ($MAXTIME sek.)<br><br>\n“;
}
while (list($key, $isdir) = each($dir))
{
   list($key, $file) = each($ret);
   if($isdir==1)
   {
      echo „(DIR) <a href=\“$file\“>$file</a><br>\n“;
   }
}
echo „<br><br>\n“;
reset($dir);
reset($ret);
while (list($key, $file) = each($ret))
{
   list($key, $isdir) = each($dir);
   if($isdir==0)
   {
      echo „<a href=\“$file\“>$file</a><br>\n“;
   }
}
?>
</body>
</html>

Do pole se opět načítají názvy jednotlivých souborů a adresářů, při volání funkce se pole předává odkazem (pro vyšší rychlost zpracování skriptu). V dalším poli se uchovávají informace o tom, zda je daná položka soubor či adresář. Opět následují dva cykly, jeden pro adresáře a jeden pro soubory.

Je nutné mít na paměti, že zpracování tohoto skriptu může trvat i déle než jen pár vteřin, pokud je ve stromu větší počet souborů (stovky, tisíce). Proto je maximální doba provádění skriptu omezena pomocí hodnoty globální proměnné $MAXTIME v sekundách a při každém průchodu funkcí GetDirArray() se otestuje, zda nevypršel čas určený pro běh skriptu.

Při tvorbě těchto skriptů jsem využil částí ukázkových skriptů na cz.php.net. Zdrojové kódy obou souborů si můžete stáhnout přímo z Interval.cz.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

3 Příspěvků v diskuzi

  1. Ahojte, do ktorej casti php mam konkretne dat tuto funkciu ?
    Do ktoreho riadku, lebo mi to nefunguje.
    FileSize($val);

  2. Řazení podle abecedy? Přijde mi to jako řazení podle dvojkové soustavy. Když mam na serveru hudbu označenou 1 – ouvertura, 2 – tango, … Tak to řadí takto: 1, 10, 11, 12, 2, 3, 4,… Chce to trochu dodělat ;-)

  3. Keby som chcel usporiadať súbory podľa dátumu (od najnovších po najstaršie), ako by sa mal upraviť príkaz SORT ?
    V manuáli cz.php.net sa mi to nepodarilo nájsť.

Odpovědět