Procházení adresářů

Na procházení adresářů se v minulosti používaly funkce opendir, readdir a closedir. Ty je na určité úlohy vhodné použít i nyní, pro většinu úloh je ale od PHP 4.3.0 (prosinec 2002) mnohem elegantnější použít funkci glob. Jak vypadá kód, který načte všechny soubory *.txt v aktuálním adresáři do pole?

<?php
// starý způsob
$soubory = array();
$dir = opendir(".");
while (($filename = readdir($dir)) !== false) {
    if (preg_match('~\\.txt$~', $filename)) {
        $soubory[] = $filename;
    }
}
closedir($dir);

// s využitím glob()
$soubory = glob("*.txt");

// funkce se dá použít i přímo ve foreach cyklu
foreach (glob("*.txt") as $filename) {
    echo "<li><a href='$filename'>$filename</a></li>\n";
}
?>

S touto funkcí je bohužel již delší dobu spojené jisté bezpečnostní riziko. To nám ale naštěstí nemusí vadit, protože použitím této funkce svůj skript zranitelnější neučiníme, ale naopak je možné tuto funkci zneužít k nekalým úmyslům. Toto bezpečnostní riziko ale může vést k tomu, že funkce bude na některých hostinzích zakázaná.

Jakub Vrána, Výuka, 20.4.2005, on-line

Diskuse

ikona llook:

Na Windows verzi je tato funkce dostupná až od 4.3.3.
20.4.2005 10:32:24

ikona spaze:

jeste bych doplnil DirectoryIterator a RecursiveDirectoryIterator z SPL (PHP5), dokumentace je pomerne _obsahla_, takze info treba na http://wiki.cc/php/DirectoryIterator
20.4.2005 13:04:38

horada:

Nechá se funkcí glob() procházet nejen aktuální adresář?
19.11.2006 23:49:56

ikona Jakub Vrána:

Samozřejmě, např. přes "podadresar/*" nebo "../*".
20.11.2006 11:05:00

Domo:

Ovšem když jsem procházel adresáře a vypisoval soubory narazil jsem na problém s kódováním. Obsahuje-li totiž soubor diakritiku, tak se v utf-8 nahradí za ?. Řeší to změna kódování na windows-1250 nebo ISO 8859-2.
6.3.2007 20:12:23

pseudo:

Lze nějak zpracovat soubory s více příponami? Kdybych například chtěl použít kromě *.txt i soubory *.html
26.6.2008 12:28:41

ikona Jakub Vrána:

Jedině pomocí array_merge(glob("*.txt"), glob("*.html")).
30.6.2008 04:49:19

Free_Loader:

Dělám to trochu jinak, pomocí pole si definuju povolené přípony...

<?php
$dir
= "*.*";
$allowed_ext = array('jpeg','jpg','gif','png','bmp'); // povolené přípony
  foreach (glob($dir) as $filename) {
      $ext = pathinfo($filename);
      if (in_array(strtolower($ext['extension']), $allowed_ext)) {
        echo ($filename .'<br>');
        }
  }
?>
1.11.2009 02:26:33

ikona janbarasek:

Ještě aby to ten adresář vypsalo, a dalo se s tím něco dělat ...
23.6.2010 20:51:20

Honza:

Ahoj....tady je ukázka konverze, našel jsem na netu a upravil pro sebe:

<?php
      $adr
= opendir("C:\Users\Honza\Desktop\FTP pokus");
      while($soubor = readdir($adr))
      {
        $file_utf8 = iconv( "iso-8859-1", "utf-8", $soubor );
        echo $file_utf8 . "<br>";
      }
?>

dejte vědět, jestli pomohlo.
Honza
18.9.2012 10:23:35
avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.