Procházení adresářů

Školení, která pořádám

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, diskuse: 10 (nové: 0)

Diskuse

ikona llook:

Na Windows verzi je tato funkce dostupná až od 4.3.3.

ikona spaze:

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

horada:

Nechá se funkcí glob() procházet nejen aktuální adresář?

ikona Jakub Vrána OpenID:

Samozřejmě, např. přes "podadresar/*" nebo "../*".

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.

pseudo:

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

ikona Jakub Vrána OpenID:

Jedině pomocí array_merge(glob("*.txt"), glob("*.html")).

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>');
        }
  }
?>

ikona janbarasek:

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

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

Diskuse je zrušena z důvodu spamu.

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.