PHP Conference Japan 2024

FilesystemIterator 類別

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

簡介

檔案系統迭代器

類別概要

class FilesystemIterator extends DirectoryIterator {
/* 常數 */
公開 常數 整數 CURRENT_MODE_MASK;
公開 常數 整數 CURRENT_AS_SELF;
公開 常數 整數 KEY_MODE_MASK;
公開 常數 整數 KEY_AS_PATHNAME;
公開 常數 整數 FOLLOW_SYMLINKS;
公開 常數 整數 KEY_AS_FILENAME;
公開 常數 整數 OTHER_MODE_MASK;
公開 常數 整數 SKIP_DOTS;
公開 常數 整數 UNIX_PATHS;
/* 方法 */
公開 __construct(字串 $directory, 整數 $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS)
公開 getFlags(): 整數
公開 key(): 字串
公開 next():
公開 rewind():
公開 setFlags(整數 $flags):
/* 繼承的方法 */
公開 SplFileInfo::getBasename(字串 $suffix = ""): 字串
公開 SplFileInfo::openFile(字串 $mode = "r", 布林值 $useIncludePath = false, ?資源 $context = null): SplFileObject
公開 SplFileInfo::setFileClass(字串 $class = SplFileObject::class):
公開 SplFileInfo::setInfoClass(字串 $class = SplFileInfo::class):
}

預定義常數

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 不會被修改。

目錄

新增註記

使用者貢獻的註記 4 則註記

paul at paulgarvin dot net
10 年前
您可能跟我一樣想知道,這個類別和 DirectoryIterator 有什麼不同?

當您使用 DirectoryIterator 迭代時,返回的每個「值」都是相同的 DirectoryIterator 物件。內部狀態會被改變,因此當您呼叫 isDir()、getPathname() 等時,會返回正確的資訊。如果您在迭代時要求鍵值,您將會得到一個整數索引值。

另一方面,FilesystemIterator(和 RecursiveDirectoryIterator)在每個迭代步驟中都會返回一個新的、不同的 SplFileInfo 物件。鍵值是檔案的完整路徑名稱。這是預設行為。您可以使用建構函式的「flags」參數來更改鍵值或值的返回內容。
blackout at drunkenlords dot com
3 年前
這是我寫的一個很棒的 FilesystemIterator 替代品,可以輕鬆地迭代您的檔案系統,包含:

* 排序 - 使用 ArrayIterator
* 正規表示式比對 - 使用 RegexIterator
* 限制 - 使用 LimitIterator

它可以完全鏈式操作

<?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 年前
DirectoryIterator 在迴圈中會返回虛擬目錄 "." 和 ".."
但 FilesystemIterator 會忽略它們。
spamblocker1@yahoo
4 個月前
以下是 DirectoryIterator 和 FileSystemIterator 的區別。

FileSystemIterator 繼承自 DirectoryIterator,擁有其所有功能,但擴展了額外的選項和特性。

- 額外的旗標和選項(例如,FileSystemIterator::SKIP_DOTS 可用於跳過 . 和 .. 項目)。
- 在迭代過程中提供更多控制和彈性。
- 適用於需要額外控制的更複雜的目錄遍歷需求。

因此,如果您只需要目錄的內容,請使用 DirectoryIterator。

如果您需要執行目錄遍歷,請使用 FileSystemIterator。
To Top