PHP Conference Japan 2024

DirectoryIterator 类

(PHP 5, PHP 7, PHP 8)

简介

DirectoryIterator 类提供了一个简单的接口,用于查看文件系统目录的内容。

类概要

DirectoryIterator 扩展 SplFileInfo 实现 SeekableIterator {
/* 方法 */
公共 __construct(字符串 $directory)
公共 current(): 混合
公共 getBasename(字符串 $suffix = ""): 字符串
公共 isDot(): 布尔值
公共 key(): 混合
公共 next():
公共 rewind():
公共 seek(整数 $offset):
公共 valid(): 布尔值
/* 继承的方法 */
public SplFileInfo::openFile(string $mode = "r", bool $useIncludePath = false, ?resource $context = null): SplFileObject
public SplFileInfo::setFileClass(string $class = SplFileObject::class): void
public SplFileInfo::setInfoClass(string $class = SplFileInfo::class): void
}

目录

添加注释

用户贡献注释 4 条注释

krystianmularczyk at gmail dot com
15 年前
显示目录中的所有文件和目录,除了 "." 和 "..".

<?php

foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if(
$fileInfo->isDot()) continue;
echo
$fileInfo->getFilename() . "<br>\n";
}

?>
alvaro at demogracia dot com
7 年前
DirectoryIterator只是一个轻量级的SplFileInfo迭代器,其方法作用于内部光标指向的任何项目。换句话说

<?php
$iterator
= new DirectoryIterator('C:\\');
echo
$iterator->getPathname();
?>

...不会打印 "C:\",而是打印检索到的第一个文件或子目录的路径,例如 "C:\$Recycle.Bin".
David Lanstein
15 年前
根据变更日志(尚未记录),DirectoryIterator::getBasename() 自 5.2.2 版本以来也可用。它接受一个参数 $suffix,如果您例如对文件使用命名约定(例如 ClassName.php),则此参数非常有用。

以下代码使用此方法递归地添加任何 tests/ 子目录中的 All*Tests.php,基本上是套件的套件。

<?php
// PHPUnit 模板代码在此处

class AllTests {
public static function
main() {
$parameters = array('verbose' => true);
PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
}

public static function
suite() {
$suite = new PHPUnit_Framework_TestSuite('AllMyTests'); // 这必须与类名不同,根据 PHPUnit
$it = new AllTestsFilterIterator(
new
RecursiveIteratorIterator(
new
RecursiveDirectoryIterator(dirname(__FILE__) . '/tests')));

for (
$it->rewind(); $it->valid(); $it->next()) {
require_once(
$it->current());
$className = $it->current()->getBasename('.php');
$suite->addTest($className::suite());
}

return
$suite;
}
}
?>

此外,上面的 AllTestsFilterIterator 扩展了 FilterIterator,并包含一个方法 accept()

<?php
class AllTestsFilterIterator extends FilterIterator {
public function
accept() {
if (
preg_match('/All.*Tests\.php/', $this->current())) {
return
true;
} else {
return
false;
}
}
}
?>
rogier at dsone dot nl
12 年前
注意使用 FilesystemIterator::UNIX_PATHS 时的行为,它并非按预期应用。

我猜这个标志是专门为在 Windows 上使用而添加的。
但是,您用来构造 RecursiveDirectoryIterator 或 FilesystemIterator 的路径将不会作为 Unix 路径可用。
我不能说这是一个错误,因为大多数方法只是纯粹继承自 DirectoryIterator。

在我的测试中,我期望一个完整的 Unix 路径。不幸的是……并非完全如预期。

<?php
// 假设 $folder = C:\projects\lang

$flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS;
$d_iterator = new RecursiveDirectoryIterator($folder, $flags);

echo
$d_iterator->getPath();

?>

预期结果:/projects/lang(或 C:/projects/lang)
实际结果:C:\projects\lang
To Top