(PHP 4, PHP 5, PHP 7, PHP 8)
dir — Возвращает экземпляр класса Directory
Псевдо-объектно-ориентированный механизм для чтения каталога. Открывается
переданный в параметре directory каталог.
directoryКаталог для открытия
context
Возвращает экземпляр класса Directory или false в случае возникновения ошибки.
| Версия | Описание |
|---|---|
| 8.0.0 |
context теперь допускает значение null.
|
Пример #1 Пример использования dir()
Обратите внимание на способ, которым осуществляется
проверка значения, возвращаемого Directory::read()
в примере, приведённом ниже. В этом примере явно проводится
проверка значения на идентичность (выражения идентичны, когда
они равны и являются одного типа - за более подробной информацией
обратитесь к главе
Операторы сравнения) значению false , поскольку
в ином случае, любой элемент каталога, чьё имя может быть
выражено как false , остановит цикл.
<?php
$d = dir("/etc/php5");
echo "Дескриптор: " . $d->handle . "\n";
echo "Путь: " . $d->path . "\n";
while (false !== ($entry = $d->read())) {
echo $entry."\n";
}
$d->close();
?>Вывод приведённого примера будет похож на:
Дескриптор: Resource id #2 Путь: /etc/php5 . .. apache cgi cli
Замечание:
Порядок, в котором метод "read" возвращает элементы каталога, зависит от операционной системы.
<?php
// simple juste use FilesystemIterator
// and you can skip dot and duble dot
// and use it in array
// new FilesystemIterator( PATH , OPTIONS ) : array
$array_file_list = new FilesystemIterator( PATH_ROOT . 'folder/', FilesystemIterator::SKIP_DOTS );
?>This one's pretty nice. After getting frustrated for hunting down .jpg files in my massive music collection (PHP would run out of memory), I thought there should be a preg_ls function.
function preg_ls ($path=".", $rec=false, $pat="/.*/") {
// it's going to be used repeatedly, ensure we compile it for speed.
$pat=preg_replace("|(/.*/[^S]*)|s", "\1円S", $pat);
//Remove trailing slashes from path
while (substr($path,-1,1)=="/") $path=substr($path,0,-1);
//also, make sure that $path is a directory and repair any screwups
if (!is_dir($path)) $path=dirname($path);
//assert either truth or falsehoold of $rec, allow no scalars to mean truth
if ($rec!==true) $rec=false;
//get a directory handle
$d=dir($path);
//initialise the output array
$ret=Array();
//loop, reading until there's no more to read
while (false!==($e=$d->read())) {
//Ignore parent- and self-links
if (($e==".")||($e=="..")) continue;
//If we're working recursively and it's a directory, grab and merge
if ($rec && is_dir($path."/".$e)) {
$ret=array_merge($ret,preg_ls($path."/".$e,$rec,$pat));
continue;
}
//If it don't match, exclude it
if (!preg_match($pat,$e)) continue;
//In all other cases, add it to the output array
$ret[]=$path."/".$e;
}
//finally, return the array
return $ret;
}
Not bad for a mere 18 lines, don't you think?
Example use:
foreach (preg_ls("/etc/X11", true, "/.*\.conf/i") as $file) echo $file."\n";
Output:
/etc/X11/xkb/README.config
/etc/X11/xorg.conf-vesa
/etc/X11/xorg.conf~
/etc/X11/gui.conf
/etc/X11/xorg.conf
/etc/X11/xorg.conf-fbdevNote that the dir object will use the default encoding for non-unicode programs on Windows with PHP 5.x.
So, if you have a file named with characters unsupported by the current default encoding, the dir->read() method will return a wrong entry.
<?php
/*
** This script is on the same directory than a file named with
** unsupported characters for the current default encoding.
*/
$d = dir("./");
while(false !== ($e = $d->read()))
echo $e . '<br/>';
?>
This will print a "?" for every unsupported characters, and not the right file name. So take care if you check with is_file/is_dir right after enumerating.<?php
/*
New recursive PHP8
gen array path with FilesystemIterator
*/
$recurcive_path = [];
rdir(path, $recurcive_path);
var_dump($recurcive_path);
function rdir(string $path, array &$recurcive_path): string
{
if ($path != '') {
$recurcive_path[] = $path;
$array_list = iterator_to_array(new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS));
foreach ($array_list as $name) {
$pathname = $name->getpathname();
if(is_dir($pathname) && $name->getfilename()[0] != '.'){
$path = rdir($pathname,$recurcive_path);
}
}
return $path;
}
return '';
}
?>Regarding samuel's comment about the dir() function not supporting Unicode properly, it's all in the encoding. The function does NOT internally change Unicode characters into question marks (?), as I was first led to believe. If you simply try to output them in UTF-8, they'll show up just right.to get a dir of http://www.example.com/directory
<?php
function remotedir($dir)
{
$dir = str_replace(" ", "%20", html_entity_decode($dir));
if (($rh = fopen($dir, 'rb')) === FALSE) { return false; }
$i = 0;
while (!feof($rh)) {
$archivos = fgetss($rh);
$directorio[$i++] = trim( substr($archivos,1,strpos($archivos," ",1)) );
}
fclose($rh);
return $directorio;
}
?>