显示目录中的所有文件和目录,除了 "." 和 "..".
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
(PHP 5, PHP 7, PHP 8)
DirectoryIterator 类提供了一个简单的接口,用于查看文件系统目录的内容。
$mode
= "r", bool $useIncludePath
= false
, ?resource $context
= null
): SplFileObject显示目录中的所有文件和目录,除了 "." 和 "..".
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
DirectoryIterator只是一个轻量级的SplFileInfo迭代器,其方法作用于内部光标指向的任何项目。换句话说
<?php
$iterator = new DirectoryIterator('C:\\');
echo $iterator->getPathname();
?>
...不会打印 "C:\",而是打印检索到的第一个文件或子目录的路径,例如 "C:\$Recycle.Bin".
根据变更日志(尚未记录),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;
}
}
}
?>
注意使用 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