La clase FilesystemIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8)


El iterador Filesystem

Sinopsis de la Clase

class FilesystemIterator extends DirectoryIterator implements SeekableIterator {
/* Constantes */
const integer CURRENT_AS_PATHNAME = 32;
const integer CURRENT_AS_FILEINFO = 0;
const integer CURRENT_AS_SELF = 16;
const integer CURRENT_MODE_MASK = 240;
const integer KEY_AS_PATHNAME = 0;
const integer KEY_AS_FILENAME = 256;
const integer FOLLOW_SYMLINKS = 512;
const integer KEY_MODE_MASK = 3840;
const integer NEW_CURRENT_AND_KEY = 256;
const integer SKIP_DOTS = 4096;
const integer UNIX_PATHS = 8192;
/* Métodos */
public __construct(string $path, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)
public current(): mixed
public getFlags(): int
public key(): string
public next(): void
public rewind(): void
public setFlags(int $flags = ?): void
/* Métodos heredados */
public DirectoryIterator::getBasename( string $suffix = ?): string
public DirectoryIterator::key(): string
public DirectoryIterator::seek(int $position): void

Constantes predefinidas


Hace que FilesystemIterator::current() devuelva el nombre de la ruta.


Hace que FilesystemIterator::current() devuelva una instancia de SplFileInfo .


Hace que FilesystemIterator::current() devuelva $this (el objeto FilesystemIterator).


Enmascara FilesystemIterator::current()


Hace que FilesystemIterator::key() devuelva el nombre de la ruta.


Hace que FilesystemIterator::key() devuelva el nombre de fichero.

Hace que RecursiveDirectoryIterator::hasChildren() siga enlaces simbólicos.


Enmascara FilesystemIterator::key()


Igual que FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.


Ignora los ficheros punto (. y ..).


Hace que las rutas usen la barra hacia adelante del estilo Unix independientemente de la predeterminada del sistema. Observe que la ruta path pasada al constructor no se modifica.

Historial de cambios

Versión Descripción
5.3.1 Añadido FilesystemIterator::FOLLOW_SYMLINKS

Tabla de contenidos

add a note

User Contributed Notes 4 notes

paul at paulgarvin dot net
9 years ago
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.
blackout at drunkenlords dot com
1 year ago
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


// 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)
$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
        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()); });


    public function
limit(int $offset = 0, int $limit = -1)
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)
parent::__construct(iterator_to_array(new RegexIterator($this, $regex, $mode, $flags, $preg_flags))) ?? $this;
thedilab at gmail dot com
7 years ago
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
ohcc at 163 dot com
2 years ago
It's impossible to return dots (. and ..) by FilesystemIterator.
To Top