The DirectoryIterator class
(PHP 5, PHP 7, PHP 8)
简介
The DirectoryIterator class provides a simple interface for viewing the contents of filesystem directories.
类摘要
/* 方法 */
/* 继承的方法 */
public SplFileInfo::openFile(string
}$mode
= "r", bool $useIncludePath
= false
, ?resource $context
= null
): SplFileObject目录
- DirectoryIterator::__construct — Constructs a new directory iterator from a path
- DirectoryIterator::current — Return the current DirectoryIterator item
- DirectoryIterator::getATime — Get last access time of the current DirectoryIterator item
- DirectoryIterator::getBasename — Get base name of current DirectoryIterator item
- DirectoryIterator::getCTime — Get inode change time of the current DirectoryIterator item
- DirectoryIterator::getExtension — Gets the file extension
- DirectoryIterator::getFilename — Return file name of current DirectoryIterator item
- DirectoryIterator::getGroup — Get group for the current DirectoryIterator item
- DirectoryIterator::getInode — Get inode for the current DirectoryIterator item
- DirectoryIterator::getMTime — Get last modification time of current DirectoryIterator item
- DirectoryIterator::getOwner — Get owner of current DirectoryIterator item
- DirectoryIterator::getPath — Get path of current Iterator item without filename
- DirectoryIterator::getPathname — Return path and file name of current DirectoryIterator item
- DirectoryIterator::getPerms — Get the permissions of current DirectoryIterator item
- DirectoryIterator::getSize — Get size of current DirectoryIterator item
- DirectoryIterator::getType — Determine the type of the current DirectoryIterator item
- DirectoryIterator::isDir — Determine if current DirectoryIterator item is a directory
- DirectoryIterator::isDot — Determine if current DirectoryIterator item is '.' or '..'
- DirectoryIterator::isExecutable — Determine if current DirectoryIterator item is executable
- DirectoryIterator::isFile — Determine if current DirectoryIterator item is a regular file
- DirectoryIterator::isLink — Determine if current DirectoryIterator item is a symbolic link
- DirectoryIterator::isReadable — Determine if current DirectoryIterator item can be read
- DirectoryIterator::isWritable — Determine if current DirectoryIterator item can be written to
- DirectoryIterator::key — Return the key for the current DirectoryIterator item
- DirectoryIterator::next — Move forward to next DirectoryIterator item
- DirectoryIterator::rewind — Rewind the DirectoryIterator back to the start
- DirectoryIterator::seek — Seek to a DirectoryIterator item
- DirectoryIterator::__toString — Get file name as a string
- DirectoryIterator::valid — Check whether current DirectoryIterator position is a valid file

User Contributed Notes 8 notes
krystianmularczyk at gmail dot com ¶
13 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";
}
?>
alvaro at demogracia dot com ¶
4 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".
rogier at dsone dot nl ¶
9 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
David Lanstein ¶
13 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;
}
}
}
?>
Mark van Straten ¶
13 years ago
Implements Iterator so you can foreach() over the content of the given directory
Kunal Bhatia->kmasterzone@gmail dot com ¶
11 years ago
Deleting all files in a directory except the one which is last modified.
<?php
$directory = dirname(__FILE__)."/demo";
$filenames = array();
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) {
if ($fileinfo->isFile()) {
$filenames[$fileinfo->getMTime()] = $fileinfo->getFilename();
}
}
ksort($filenames);
print_r($filenames);
echo "\n";
$i=0;
if(sizeof($filenames)>1){
foreach ($filenames as $file){
if($i>0){
echo $file."\n";
unlink($directory."/".$file);
}
$i++;
}
}
?>
abdel at elghafoud dot com ¶
8 years ago
Shows us recursively all files and catalogues in directory except "." and "..".
<?php
/**
* @param string $directory
* @param array $files
* @return array
*/
public function recursiveDirectoryIterator ($directory = null, $files = array()) {
$iterator = new \DirectoryIterator ( $directory );
foreach ( $iterator as $info ) {
if ($info->isFile ()) {
$files [$info->__toString ()] = $info;
} elseif (!$info->isDot ()) {
$list = array($info->__toString () => $this->recursiveDirectoryIterator(
$directory.DIRECTORY_SEPARATOR.$info->__toString ()
));
if(!empty($files))
$files = array_merge_recursive($files, $filest);
else {
$files = $list;
}
}
}
return $files;
}
?>
incredimike ¶
4 years ago
For some reason, the `isDot()` method doesn't return positive for the `.DS_Store` file generated by Mac OS's Finder. In practice, I've had to write code to explicitly check for this file:
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot() || $fileInfo->getBasename() === '.DS_Store') continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
备份地址:http://www.lvesu.com/blog/php/class.directoryiterator.php