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á.
Diskuse
Na Windows verzi je tato funkce dostupná až od 4.3.3.
20.4.2005 10:32:24
jeste bych doplnil DirectoryIterator a RecursiveDirectoryIterator z SPL (PHP5), dokumentace je pomerne _obsahla_, takze info treba na
http://wiki.cc/php/DirectoryIterator20.4.2005 13:04:38
horada:
Nechá se funkcí glob() procházet nejen aktuální adresář?
19.11.2006 23:49:56
Samozřejmě, např. přes "podadresar/*" nebo "../*".
20.11.2006 11:05:00
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
Jedině pomocí array_merge(glob("*.txt"), glob("*.html")).
30.6.2008 04:49:19
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
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