2024 年 PHP 日本大会

dir

(PHP 4, PHP 5, PHP 7, PHP 8)

dir返回 Directory 类的实例

描述

dir(字符串 $directory, ?资源 $context = null): Directory|false

一种用于读取目录的伪面向对象机制。打开给定的 directory

参数

directory

要打开的目录

context

一个 上下文流 资源

返回值

返回 Directory 的一个实例,或者在发生错误时返回 false

变更日志

版本 描述
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 方法返回目录项的顺序取决于系统。

添加注释

用户贡献的注释 6 条注释

synnus at gmail dot com
3 年前
<?php

// 简单地使用 FilesystemIterator
// 可以跳过点和双点
// 并将其用于数组
// new FilesystemIterator( PATH , OPTIONS ) : array

$array_file_list = new FilesystemIterator( PATH_ROOT . 'folder/', FilesystemIterator::SKIP_DOTS );

?>
fordiman at gmail dot com
18 年前
这个不错。在为在我的海量音乐收藏中搜索 .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
samuel dot l at mushicrew dot com
18 年前
请注意,在使用 PHP 5.x 的 Windows 上的非 Unicode 程序中,dir 对象将使用默认编码。

因此,如果您有一个使用当前默认编码不支持的字符命名的文件,则 dir->read() 方法将返回错误的条目。

<?php
/*
** 此脚本与一个使用
** 当前默认编码不支持的字符命名的文件位于同一目录。
*/
$d = dir("./");
while(
false !== ($e = $d->read()))
echo
$e . '<br/>';
?>

这将为每个不受支持的字符打印一个“?”,而不是正确的文件名。因此,如果您在枚举后立即使用 is_file/is_dir 进行检查,请注意。
匿名
18 年前
关于 samuel 关于 dir() 函数无法正确支持 Unicode 的评论,这完全在于编码。该函数不会内部将 Unicode 字符更改为问号 (?),正如我最初所认为的那样。如果您只是尝试以 UTF-8 输出它们,它们就会正确显示。
synnus at gmail dot com
2 年前
<?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
'';
}

?>
GUILLE@GARGANO
13年前
获取目录 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;
}
?>
To Top