PHP Conference Nagoya 2025

A classe FilesystemIterator

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

Introdução

O iterador do sistema de arquivos

Resumo da classe

class FilesystemIterator extends DirectoryIterator {
/* Constantes */
public const int CURRENT_MODE_MASK;
public const int CURRENT_AS_PATHNAME;
public const int CURRENT_AS_FILEINFO;
public const int CURRENT_AS_SELF;
public const int KEY_MODE_MASK;
public const int KEY_AS_PATHNAME;
public const int FOLLOW_SYMLINKS;
public const int KEY_AS_FILENAME;
public const int NEW_CURRENT_AND_KEY;
public const int OTHER_MODE_MASK;
public const int SKIP_DOTS;
public const int UNIX_PATHS;
/* Métodos */
public __construct(string $directory, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)
public getFlags(): int
public key(): string
public next(): void
public rewind(): void
public setFlags(int $flags): void
/* Métodos herdados */
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
}

Constantes predefinidas

FilesystemIterator::CURRENT_AS_PATHNAME

Faz com que FilesystemIterator::current() retorne o pathname.

FilesystemIterator::CURRENT_AS_FILEINFO

Faz com que FilesystemIterator::current() retorne uma instância SplFileInfo.

FilesystemIterator::CURRENT_AS_SELF

Faz com que FilesystemIterator::current() retorne $this (o FilesystemIterator).

FilesystemIterator::CURRENT_MODE_MASK

Máscara para FilesystemIterator::current()

FilesystemIterator::KEY_AS_PATHNAME

Faz com que FilesystemIterator::key() retorne o pathname.

FilesystemIterator::KEY_AS_FILENAME

Faz com que FilesystemIterator::key() retorne o filename.

Faz com que RecursiveDirectoryIterator::hasChildren() siga os links simbólicos.

FilesystemIterator::KEY_MODE_MASK

Máscara para FilesystemIterator::key()

FilesystemIterator::NEW_CURRENT_AND_KEY

Mesmo que FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.

FilesystemIterator::OTHER_MODE_MASK

Máscara usada para FilesystemIterator::getFlags() e FilesystemIterator::setFlags().

FilesystemIterator::SKIP_DOTS

Pula os arquivos de ponto (. e ..).

FilesystemIterator::UNIX_PATHS

Faz com que os caminhos usem barra inclinada no estilo Unix, independentemente do padrão do sistema. Observe que o path passado ao construtor não é modificado.

Índice

adicione uma nota

Notas Enviadas por Usuários (em inglês) 4 notes

up
73
paul at paulgarvin dot net
10 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.
up
12
blackout at drunkenlords dot com
3 years 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

<?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;
}
}
up
3
thedilab at gmail dot com
9 years ago
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
up
1
spamblocker1@yahoo
4 months ago
Here's the difference between DirectoryIterator and FileSystemIterator.

FileSystemIterator extends DirectoryIterator, inheriting all of it's functionalities, but extending it with additional options and features:

- Additional flags and options (e.g., FileSystemIterator::SKIP_DOTS to skip . and .. entries).
- Offers more control and flexibility over the iteration process.
- Suitable for more complex directory traversal requirements where additional control is needed.

So if you just need the contents of a directory, use DirectoryIterator.

If you need to do directory traversal, use FileSystemIterator.
To Top