The FilesystemIterator class
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
简介
The Filesystem iterator
类摘要
$directory
, int $flags
= FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)$mode
= "r", bool $useIncludePath
= false
, ?resource $context
= null
): SplFileObject预定义常量
FilesystemIterator::CURRENT_AS_PATHNAME
-
Makes FilesystemIterator::current() return the pathname.
FilesystemIterator::CURRENT_AS_FILEINFO
-
Makes FilesystemIterator::current() return an SplFileInfo instance.
FilesystemIterator::CURRENT_AS_SELF
-
Makes FilesystemIterator::current() return $this (the FilesystemIterator).
FilesystemIterator::CURRENT_MODE_MASK
FilesystemIterator::KEY_AS_PATHNAME
-
Makes FilesystemIterator::key() return the pathname.
FilesystemIterator::KEY_AS_FILENAME
-
Makes FilesystemIterator::key() return the filename.
FilesystemIterator::FOLLOW_SYMLINKS
-
Makes RecursiveDirectoryIterator::hasChildren() follow symlinks.
FilesystemIterator::KEY_MODE_MASK
FilesystemIterator::NEW_CURRENT_AND_KEY
-
Same as
FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO
. FilesystemIterator::SKIP_DOTS
-
Skips dot files (
.
and..
). FilesystemIterator::UNIX_PATHS
-
Makes paths use Unix-style forward slash irrespective of system default. Note that the
path
that is passed to the constructor is not modified.
目录
- FilesystemIterator::__construct — Constructs a new filesystem iterator
- FilesystemIterator::current — The current file
- FilesystemIterator::getFlags — Get the handling flags
- FilesystemIterator::key — Retrieve the key for the current file
- FilesystemIterator::next — Move to the next file
- FilesystemIterator::rewind — Rewinds back to the beginning
- FilesystemIterator::setFlags — Sets handling flags

User Contributed Notes 4 notes
You may be wondering, like I did, what is the difference between this class and DirectoryIterator?
When you iteterate using DirectoryIterator each "value" returned is the same DirectoryIterator object. The internal state is changed so when you call isDir(), getPathname(), etc the correct information is returned. If you were to ask for a key when iterating you will get an integer index value.
FilesystemIterator (and RecursiveDirectoryIterator) on the other hand returns a new, different SplFileInfo object for each iteration step. The key is the full pathname of the file. This is by default. You can change what is returned for the key or value using the "flags" arguement to the constructor.
Here's a great little drop in replacement for FilesystemIterator I wrote to easily Iterate your filesystem, including:
* Sorting - using ArrayIterator
* Regex Matching - using RegexIterator
* Limiting - using LimitIterator
It's fully chainable
<?php
// Sort by filemtime
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime();
// Sort by filemtime -> Limit output to 10
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->limit(0, 10);
// Sort by filemtime -> Only get CSV files -> Limit to 10
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10);
// Sort by filemtime -> Only get CSV files -> Limit to 10 -> and back to sorting by Filename
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10)->sortByFilename();
// Sort by any of SplFileInfo's get*() methods i.e. Owner, CTime, Basename, ATime, Perms, Type, isFile, anything
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByOwner();
// Foreach
foreach ((new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10) AS $file)
{
print $file->getFilename() . "<br>\n";
}
// The Class
class AdvancedFilesystemIterator extends ArrayIterator
{
public function __construct(string $path, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)
{
parent::__construct(iterator_to_array(new FilesystemIterator($path, $flags)));
}
public function __call(string $name, array $arguments)
{
if (preg_match('/^sortBy(.*)/', $name, $m)) return $this->sort('get' . $m[1]);
throw new MemberAccessException('Method ' . $methodName . ' not exists');
}
public function sort($method)
{
if (!method_exists('SplFileInfo', $method)) throw new InvalidArgumentException(sprintf('Method "%s" does not exist in SplFileInfo', $method));
$this->uasort(function(SplFileInfo $a, SplFileInfo $b) use ($method) { return (is_string($a->$method()) ? strnatcmp($a->$method(), $b->$method()) : $b->$method() - $a->$method()); });
return $this;
}
public function limit(int $offset = 0, int $limit = -1)
{
return parent::__construct(iterator_to_array(new LimitIterator($this, $offset, $limit))) ?? $this;
}
public function match(string $regex, int $mode = RegexIterator::MATCH, int $flags = 0, int $preg_flags = 0)
{
return parent::__construct(iterator_to_array(new RegexIterator($this, $regex, $mode, $flags, $preg_flags))) ?? $this;
}
}
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
备份地址:http://www.lvesu.com/blog/php/class.filesystemiterator.php