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á.
Diskuse
Na Windows verzi je tato funkce dostupná až od 4.3.3.
horada:
Nechá se funkcí glob() procházet nejen aktuální adresář?
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
Jakub Vrána :
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>');
}
}
?>
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.