PHP 8.5.0 Released!

The DirectoryIterator class

(PHP 5, PHP 7, PHP 8)

Introduction

The DirectoryIterator class provides a simple interface for viewing the contents of filesystem directories.

Class synopsis

class DirectoryIterator extends SplFileInfo implements SeekableIterator {
/* Methods */
public __construct (string $directory)
public current (): mixed
public getBasename (string $suffix = ""): string
public getExtension (): string
public getFilename (): string
public isDot (): bool
public key (): mixed
public next (): void
public rewind (): void
public seek (int $offset): void
public __toString (): string
public valid (): bool
/* Inherited methods */
public SplFileInfo::getBasename (string $suffix = ""): string
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
}

Table of Contents

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 4 notes

up
59
krystianmularczyk at gmail dot com
16 years ago
Shows us all files and catalogues in directory except "." and "..".
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
 if($fileInfo->isDot()) continue;
 echo $fileInfo->getFilename() . "<br>\n";
}
?>
up
5
David Lanstein
16 years ago
DirectoryIterator::getBasename() has been also been available since 5.2.2, according to the changelog (not documented yet). It takes a parameter $suffix, and is useful if, for instance, you use a naming convention for your files (e.g. ClassName.php). 
The following code uses this to add recursively All*Tests.php in any subdirectory off of tests/, basically, suites of suites.
<?php
// PHPUnit boilerplate code goes here
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'); // this must be something different than the class name, per 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;
 }
}
?>

Also, the AllTestsFilterIterator above extends FilterIterator, and contains one method, accept():
<?php
class AllTestsFilterIterator extends FilterIterator {
 public function accept() {
 if (preg_match('/All.*Tests\.php/', $this->current())) {
 return true;
 } else {
 return false;
 }
 }
}
?>
up
9
rogier at dsone dot nl
13 years ago
Beware of the behavior when using FilesystemIterator::UNIX_PATHS, it's not applied as you might expect.
I guess this flag is added especially for use on windows.
However, the path you construct the RecursiveDirectoryIterator or FilesystemIterator with will not be available as a unix path.
I can't say this is a bug, since most methods are just purely inherited from DirectoryIterator.
In my test, I'd expected a complete unix path. Unfortunately... not quite as expected:
<?php
 // say $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();
?>

expected result: /projects/lang (or C:/projects/lang)
actual result: C:\projects\lang
up
3
alvaro at demogracia dot com
8 years ago
DirectoryIterator is just an lightweight SplFileInfo iterator and its methods operate on whatever item the internal cursor points to. In other words:
<?php
$iterator = new DirectoryIterator('C:\\');
echo $iterator->getPathname();
?>

... will NOT print "C:\" but the path of the first file or subdirectory retrieved, e.g. "C:\$Recycle.Bin".
+add a note

AltStyle によって変換されたページ (->オリジナル) /