<?php
// 简单地使用 FilesystemIterator
// 可以跳过点和双点
// 并将其用于数组
// new FilesystemIterator( PATH , OPTIONS ) : array
$array_file_list = new FilesystemIterator( PATH_ROOT . 'folder/', FilesystemIterator::SKIP_DOTS );
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
dir — 返回 Directory 类的实例
版本 | 描述 |
---|---|
8.0.0 |
context 现在可以为空。 |
示例 #1 dir() 示例
请注意下面的示例中 Directory::read() 返回值检查的方式。我们明确地测试返回值是否与 (等于且类型相同 - 参见 比较运算符 获取更多信息) false
相同,因为否则,任何名称计算结果为 false
的目录项都将停止循环。
<?php
$d = dir("/etc/php5");
echo "Handle: " . $d->handle . "\n";
echo "Path: " . $d->path . "\n";
while (false !== ($entry = $d->read())) {
echo $entry."\n";
}
$d->close();
?>
以上示例将输出类似以下内容
Handle: Resource id #2 Path: /etc/php5 . .. apache cgi cli
注意:
read 方法返回目录项的顺序取决于系统。
<?php
// 简单地使用 FilesystemIterator
// 可以跳过点和双点
// 并将其用于数组
// new FilesystemIterator( PATH , OPTIONS ) : array
$array_file_list = new FilesystemIterator( PATH_ROOT . 'folder/', FilesystemIterator::SKIP_DOTS );
?>
这个不错。在为在我的海量音乐收藏中搜索 .jpg 文件而感到沮丧之后(PHP 会耗尽内存),我认为应该有一个 preg_ls 函数。
function preg_ls ($path=".", $rec=false, $pat="/.*/") {
// 它将被重复使用,确保我们对其进行编译以提高速度。
$pat=preg_replace("|(/.*/[^S]*)|s", "\\1S", $pat);
// 从路径中删除尾部斜杠
while (substr($path,-1,1)=="/") $path=substr($path,0,-1);
// 此外,确保 $path 是一个目录并修复任何错误
if (!is_dir($path)) $path=dirname($path);
// 断言 $rec 的真假,允许任何标量表示真
if ($rec!==true) $rec=false;
// 获取目录句柄
$d=dir($path);
// 初始化输出数组
$ret=Array();
// 循环,读取直到没有更多内容可读
while (false!==($e=$d->read())) {
// 忽略父级和自链接
if (($e==".")||($e=="..")) continue;
// 如果我们正在递归工作并且它是一个目录,则获取并合并
if ($rec && is_dir($path."/".$e)) {
$ret=array_merge($ret,preg_ls($path."/".$e,$rec,$pat));
continue;
}
// 如果它不匹配,则将其排除
if (!preg_match($pat,$e)) continue;
// 在所有其他情况下,将其添加到输出数组
$ret[]=$path."/".$e;
}
// 最后,返回数组
return $ret;
}
仅 18 行,还不错,不是吗?
使用示例
foreach (preg_ls("/etc/X11", true, "/.*\.conf/i") as $file) echo $file."\n";
输出
/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-fbdev
请注意,在使用 PHP 5.x 的 Windows 上的非 Unicode 程序中,dir 对象将使用默认编码。
因此,如果您有一个使用当前默认编码不支持的字符命名的文件,则 dir->read() 方法将返回错误的条目。
<?php
/*
** 此脚本与一个使用
** 当前默认编码不支持的字符命名的文件位于同一目录。
*/
$d = dir("./");
while(false !== ($e = $d->read()))
echo $e . '<br/>';
?>
这将为每个不受支持的字符打印一个“?”,而不是正确的文件名。因此,如果您在枚举后立即使用 is_file/is_dir 进行检查,请注意。
关于 samuel 关于 dir() 函数无法正确支持 Unicode 的评论,这完全在于编码。该函数不会内部将 Unicode 字符更改为问号 (?),正如我最初所认为的那样。如果您只是尝试以 UTF-8 输出它们,它们就会正确显示。
<?php
/*
新的PHP8递归函数
使用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 '';
}
?>
获取目录 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;
}
?>