Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

Výpis obsahu adresáře

06. 07. 2002 | Petr Toman | PHP | Komentáře: 3

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.


Reklama


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Komentáře ke článku

Přidat nový komentář

Farik

Autor komentáře: Farik

Datum vložení: 05. Únor 2010, 14:43:41

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

kubakoumak

Autor komentáře: kubakoumak

Datum vložení: 18. Červen 2011, 15:57:34

Ř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 ;-)

Vlado

Autor komentáře: Vlado

Datum vložení: 08. Únor 2012, 08:56:52

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ť.

Zpět na začátek komentářů | Zpět na začátek článku

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
EU doména jen 49 Kč + www stránky zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.