FilesystemIterator クラス

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

はじめに

Filesystem イテレータです。

クラス概要

class FilesystemIterator extends DirectoryIterator implements SeekableIterator {
/* 定数 */
const int CURRENT_AS_PATHNAME = 32;
const int CURRENT_AS_FILEINFO = 0;
const int CURRENT_AS_SELF = 16;
const int CURRENT_MODE_MASK = 240;
const int KEY_AS_PATHNAME = 0;
const int KEY_AS_FILENAME = 256;
const int FOLLOW_SYMLINKS = 512;
const int KEY_MODE_MASK = 3840;
const int NEW_CURRENT_AND_KEY = 256;
const int SKIP_DOTS = 4096;
const int UNIX_PATHS = 8192;
/* メソッド */
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
/* 継承したメソッド */
public DirectoryIterator::getBasename(string $suffix = ""): string
public DirectoryIterator::key(): int|false
public DirectoryIterator::seek(int $offset): void
}

定義済み定数

FilesystemIterator::CURRENT_AS_PATHNAME

FilesystemIterator::current() がパス名を返すようにします。

FilesystemIterator::CURRENT_AS_FILEINFO

FilesystemIterator::current()SplFileInfo のインスタンスを返すようにします。

FilesystemIterator::CURRENT_AS_SELF

FilesystemIterator::current() が $this (FilesystemIterator) を返すようにします。

FilesystemIterator::CURRENT_MODE_MASK

FilesystemIterator::current() をマスクします。

FilesystemIterator::KEY_AS_PATHNAME

FilesystemIterator::key() がパス名を返すようにします。

FilesystemIterator::KEY_AS_FILENAME

FilesystemIterator::key() がファイル名を返すようにします。

RecursiveDirectoryIterator::hasChildren() がシンボリックリンクのリンク先をたどるようにします。

FilesystemIterator::KEY_MODE_MASK

FilesystemIterator::key() をマスクします。

FilesystemIterator::NEW_CURRENT_AND_KEY

FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO と同じ。

FilesystemIterator::SKIP_DOTS

ドットファイル (. および ..) をスキップします。

FilesystemIterator::UNIX_PATHS

システムのデフォルトにかかわらず、Unix スタイルのスラッシュでパスをあらわすようにします。 コンストラクタから渡された path は変更されないことに注意しましょう。

目次

add a note add a note

User Contributed Notes 4 notes

up
65
paul at paulgarvin dot net
7 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
6
thedilab at gmail dot com
6 years ago
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
up
1
blackout at drunkenlords dot com
4 months 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
-12
ohcc at 163 dot com
1 year ago
It's impossible to return dots (. and ..) by FilesystemIterator.
To Top