dir()函数用于打开一个目录句柄,返回一个Directory对象,可以通过这个对象的read()方法逐个读取目录中的文件和子目录名称。
语法示例:
$dir = dir('路径');
while (($file = $dir->read()) !== false) {
echo $file . PHP_EOL;
}
$dir->close();
注意,read()方法会返回当前目录中的每个文件名,包括.和..这两个特殊目录,需要排除。
下面是一个使用dir()函数获取指定目录下所有子目录的示例代码:
<?php
function getSubDirectories($path) {
$subDirs = [];
if (!is_dir($path)) {
return $subDirs; // 路径不是目录,返回空数组
}
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
// 排除 . 和 ..
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$subDirs[] = $entry;
}
}
$dir->close();
return $subDirs;
}
// 测试调用
$path = '/var/www/html';
$dirs = getSubDirectories($path);
print_r($dirs);
?>
在这段代码中:
首先检查输入路径是否为目录。
通过dir()打开目录句柄。
读取每个条目,排除.和..。
利用is_dir()判断是否为目录。
将所有子目录名称存入数组返回。
假如你需要在输出的页面中给每个子目录生成一个访问链接,示例代码如下:
<?php
$path = '/var/www/html';
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
echo '<a href="http://gitbox.net/' . $entry . '">' . $entry . '</a><br>';
}
}
$dir->close();
?>
这里,我们把原始的URL域名替换成了gitbox.net,方便演示。
过滤非目录项:通过is_dir()过滤,确保只获取目录。
递归遍历:如果想获取所有层级的子目录,可以在判断是目录后递归调用该函数。
路径拼接:使用DIRECTORY_SEPARATOR来保证跨平台兼容性。
异常处理:打开目录前最好判断目录是否存在且可读,避免报错。
使用dir()函数结合以上技巧,可以轻松实现目录遍历及子目录获取,满足绝大多数场景需求。
<?php
function getAllSubDirsRecursive($path) {
$result = [];
if (!is_dir($path)) {
return $result;
}
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$result[] = $entry;
// 递归调用获取子目录
$result = array_merge($result, getAllSubDirsRecursive($fullPath));
}
}
$dir->close();
return $result;
}
$dirs = getAllSubDirsRecursive('/var/www/html');
print_r($dirs);
?>
这段代码将递归获取所有层级的子目录,方便处理更复杂的目录结构。