Класс FilesystemIterator

(PHP 5 >= 5.3.0)

Введение

Итератор файловой системы

Обзор классов

FilesystemIterator extends DirectoryIterator implements SeekableIterator , Traversable , Iterator {
/* Константы */
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 ;
/* Методы */
public __construct ( string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS ] )
public mixed current ( void )
public int getFlags ( void )
public string key ( void )
public void next ( void )
public void rewind ( void )
public void setFlags ([ int $flags ] )
/* Наследуемые методы */
public DirectoryIterator DirectoryIterator::current ( void )
public int DirectoryIterator::getATime ( void )
public string DirectoryIterator::getBasename ([ string $suffix ] )
public int DirectoryIterator::getCTime ( void )
public string DirectoryIterator::getExtension ( void )
public string DirectoryIterator::getFilename ( void )
public int DirectoryIterator::getGroup ( void )
public int DirectoryIterator::getInode ( void )
public int DirectoryIterator::getMTime ( void )
public int DirectoryIterator::getOwner ( void )
public string DirectoryIterator::getPath ( void )
public string DirectoryIterator::getPathname ( void )
public int DirectoryIterator::getPerms ( void )
public int DirectoryIterator::getSize ( void )
public string DirectoryIterator::getType ( void )
public bool DirectoryIterator::isDir ( void )
public bool DirectoryIterator::isDot ( void )
public bool DirectoryIterator::isExecutable ( void )
public bool DirectoryIterator::isFile ( void )
public bool DirectoryIterator::isLink ( void )
public bool DirectoryIterator::isReadable ( void )
public bool DirectoryIterator::isWritable ( void )
public string DirectoryIterator::key ( void )
public void DirectoryIterator::next ( void )
public void DirectoryIterator::rewind ( void )
public void DirectoryIterator::seek ( int $position )
public string DirectoryIterator::__toString ( void )
public bool DirectoryIterator::valid ( 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

Пропускает точечные файлы (. and ..).

FilesystemIterator::UNIX_PATHS

Заставляет все пути использовать обратный слэш в Unix-стиле, независимо от настроек системы по умолчанию.

Список изменений

Версия Описание
5.3.1 Добавлена константа FilesystemIterator::FOLLOW_SYMLINKS

Содержание

Коментарии

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.
2014-05-10 18:08:49
http://php5.kiev.ua/manual/ru/class.filesystemiterator.html
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
2015-10-06 18:13:21
http://php5.kiev.ua/manual/ru/class.filesystemiterator.html
It's impossible to return dots (. and ..) by FilesystemIterator.
2020-06-09 06:31:31
http://php5.kiev.ua/manual/ru/class.filesystemiterator.html
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(010);

// Sort by filemtime -> Only get CSV files -> Limit to 10
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(010);

// 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(010)->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(010) AS $file)
{
    print 
$file->getFilename() . "<br>\n";
}

// The Class
class AdvancedFilesystemIterator extends ArrayIterator
{
    public function 
__construct(string $pathint $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 $aSplFileInfo $b) use ($method) { return (is_string($a->$method()) ? strnatcmp($a->$method(), $b->$method()) : $b->$method() - $a->$method()); });

        return 
$this;
    }

    public function 
limit(int $offset 0int $limit = -1)
    {
        return 
parent::__construct(iterator_to_array(new LimitIterator($this$offset$limit))) ?? $this;
    }

    public function match(
string $regexint $mode RegexIterator::MATCH, int $flags 0int $preg_flags 0)
    {
        return 
parent::__construct(iterator_to_array(new RegexIterator($this$regex$mode$flags$preg_flags))) ?? $this;
    }
}
2021-07-22 09:20:07
http://php5.kiev.ua/manual/ru/class.filesystemiterator.html

    Поддержать сайт на родительском проекте КГБ