FilesystemIterator クラス
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
はじめに
Filesystem イテレータです。
クラス概要
/* 定数 */
/* メソッド */
public __construct(string
$directory
, int $flags
= FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)/* 継承したメソッド */
public SplFileInfo::openFile(string
}$mode
= "r", bool $useIncludePath
= false
, ?resource $context
= null
): SplFileObject定義済み定数
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() がファイル名を返すようにします。
FilesystemIterator::FOLLOW_SYMLINKS
-
RecursiveDirectoryIterator::hasChildren() がシンボリックリンクのリンク先をたどるようにします。
FilesystemIterator::KEY_MODE_MASK
-
FilesystemIterator::key() をマスクします。
FilesystemIterator::NEW_CURRENT_AND_KEY
-
FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO
と同じ。 FilesystemIterator::OTHER_MODE_MASK
-
FilesystemIterator::getFlags() と FilesystemIterator::setFlags() で使うマスク
FilesystemIterator::SKIP_DOTS
-
ドットファイル (
.
および..
) をスキップします。 FilesystemIterator::UNIX_PATHS
-
システムのデフォルトにかかわらず、Unix スタイルのスラッシュでパスをあらわすようにします。 コンストラクタから渡された
path
は変更されないことに注意しましょう。
目次
- FilesystemIterator::__construct — 新しい filesystem イテレータを作成する
- FilesystemIterator::current — 現在のファイル
- FilesystemIterator::getFlags — 処理フラグを取得する
- FilesystemIterator::key — 現在のファイルのキーを取得する
- FilesystemIterator::next — 次のファイルに移動する
- FilesystemIterator::rewind — 先頭に巻き戻す
- FilesystemIterator::setFlags — 処理フラグを設定する
+add a note
User Contributed Notes 4 notes
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.
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;
}
}
thedilab at gmail dot com ¶
9 years ago
DirectoryIterator returns virtual directories "." and ".." in a loop.
But FilesystemIterator ignores them.
spamblocker1@yahoo ¶
5 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.