FilesystemIterator 类

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

简介

文件系统迭代器

类概要

class FilesystemIterator extends DirectoryIterator {
/* 常量 */
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;
/* 方法 */
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 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
}

预定义常量

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::OTHER_MODE_MASK

用于 FilesystemIterator::getFlags()FilesystemIterator::setFlags() 的屏蔽。

FilesystemIterator::SKIP_DOTS

跳过点文件 (...)。

FilesystemIterator::UNIX_PATHS

使路径使用 Unix 风格的正斜杠,无论系统默认值是什么。请注意,传递给构造函数的 path 不会被修改。

目录

添加说明

用户贡献说明 5 notes

paul at paulgarvin dot net
10 年前
您可能想知道,就像我一样,这个类和 DirectoryIterator 有什么区别?

当您使用 DirectoryIterator 进行迭代时,返回的每个“值”都是相同的 DirectoryIterator 对象。内部状态会发生改变,因此当您调用 isDir()、getPathname() 等时,会返回正确的信息。如果您在迭代时要求键,您将获得一个整型索引值。

另一方面,FilesystemIterator(和 RecursiveDirectoryIterator)为每个迭代步骤返回一个新的、不同的 SplFileInfo 对象。键是文件的完整路径名。这是默认情况。您可以使用构造函数的“标志”参数来更改键或值的返回值。
blackout at drunkenlords dot com
3 年前
这是一个我编写的小巧的 FilesystemIterator 替代品,它可以轻松地迭代您的文件系统,包括

* 排序 - 使用 ArrayIterator
* 正则表达式匹配 - 使用 RegexIterator
* 限制 - 使用 LimitIterator

它是完全可链接的

<?php

// 按文件修改时间排序
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime();

// 按文件修改时间排序 -> 将输出限制为 10 个
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->limit(0, 10);

// 按文件修改时间排序 -> 只获取 CSV 文件 -> 限制为 10 个
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10);

// 按文件修改时间排序 -> 只获取 CSV 文件 -> 限制为 10 个 -> 然后按文件名排序
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10)->sortByFilename();

// 按 SplFileInfo 的任何 get*() 方法排序,例如 Owner、CTime、Basename、ATime、Perms、Type、isFile 等
$files = (new AdvancedFilesystemIterator('/path/to/files'))->sortByOwner();

// 循环遍历
foreach ((new AdvancedFilesystemIterator('/path/to/files'))->sortByMTime()->match('/csv$/')->limit(0, 10) AS $file)
{
print
$file->getFilename() . "<br>\n";
}

// 类定义
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
8 年前
DirectoryIterator 在循环中返回虚拟目录“.” 和“..” 。
但 FilesystemIterator 会忽略它们。
spamblocker1@yahoo
1 个月前
以下是 DirectoryIterator 和 FileSystemIterator 之间的区别。

FileSystemIterator 扩展了 DirectoryIterator,继承了它所有的功能,但又添加了一些额外的选项和特性

- 额外的标志和选项(例如:FileSystemIterator::SKIP_DOTS 跳过 . 和 .. 条目)。
- 提供对迭代过程的更多控制和灵活性。
- 适用于需要额外控制的更复杂目录遍历需求。

所以,如果您只需要目录的内容,请使用 DirectoryIterator。

如果您需要进行目录遍历,请使用 FileSystemIterator。
ohcc at 163 dot com
4 年前
FilesystemIterator 无法返回点(. 和 ..)。
To Top