2024 PHP Conference Japan

DirectoryIterator 類別

(PHP 5, PHP 7, PHP 8)

簡介

DirectoryIterator 類別提供了一個簡單的介面,用於檢視檔案系統目錄的內容。

類別概要

類別 DirectoryIterator 繼承自 SplFileInfo 實作 SeekableIterator {
/* 方法 */
公開 __construct(字串 $directory)
公開 current(): 混合
公開 getBasename(字串 $suffix = ""): 字串
公開 isDot(): 布林值
公開 key(): 混合
公開 next():
公開 rewind():
公開 seek(整數 $offset):
公開 __toString(): 字串
公開 valid(): 布林值
/* 繼承的方法 */
公開 SplFileInfo::getBasename(字串 $suffix = ""): 字串
公開 SplFileInfo::openFile(字串 $mode = "r", 布林值 $useIncludePath = false, ?資源 $context = null): SplFileObject
公開 SplFileInfo::setFileClass(字串 $class = SplFileObject::class):
公開 SplFileInfo::setInfoClass(字串 $class = SplFileInfo::class):
}

目錄

新增註釋

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

krystianmularczyk at gmail dot com
15 年前
顯示目錄中除了 "." 和 ".." 之外的所有檔案和目錄。

<?php

foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if(
$fileInfo->isDot()) continue;
echo
$fileInfo->getFilename() . "<br>\n";
}

?>
alvaro at demogracia dot com
7 年前
DirectoryIterator 只是一個輕量級的 SplFileInfo 迭代器,其方法作用於內部游標指向的任何項目。換句話說

<?php
$iterator
= new DirectoryIterator('C:\\');
echo
$iterator->getPathname();
?>

... 並不會印出 "C:\",而是會印出第一個被擷取的檔案或子目錄的路徑,例如 "C:\$Recycle.Bin"。
David Lanstein
15 年前
根據更新日誌(尚未記錄),DirectoryIterator::getBasename() 自 5.2.2 版起也已可用。它接受一個 $suffix 參數,如果您對檔案使用命名慣例(例如 ClassName.php),這會很有用。

以下程式碼使用這個方法遞迴地將 tests/ 下任何子目錄中的所有 All*Tests.php 檔案加入,基本上就是測試套件的套件。

<?php
// PHPUnit 樣板程式碼寫在這裡

class AllTests {
public static function
main() {
$parameters = array('verbose' => true);
PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
}

public static function
suite() {
$suite = new PHPUnit_Framework_TestSuite('AllMyTests'); // 根據 PHPUnit 規定,這個名稱必須與類別名稱不同
$it = new AllTestsFilterIterator(
new
RecursiveIteratorIterator(
new
RecursiveDirectoryIterator(dirname(__FILE__) . '/tests')));

for (
$it->rewind(); $it->valid(); $it->next()) {
require_once(
$it->current());
$className = $it->current()->getBasename('.php');
$suite->addTest($className::suite());
}

return
$suite;
}
}
?>

此外,上面的 AllTestsFilterIterator 繼承自 FilterIterator,並包含一個方法 accept()

<?php
類別 AllTestsFilterIterator 繼承 FilterIterator {
公開函式
accept() {
如果 (
preg_match('/All.*Tests\.php/', $this->current())) {
返回
true;
} 否則 {
返回
false;
}
}
}
?>
rogier at dsone dot nl
12 年前
使用 FilesystemIterator::UNIX_PATHS 時要注意它的行為,它並不如您預期般運作。

我猜想這個旗標是專門為了在 Windows 上使用而新增的。
然而,您用來建構 RecursiveDirectoryIterator 或 FilesystemIterator 的路徑將無法以 Unix 路徑的形式取得。
我不能說這是一個錯誤,因為大多數方法都是直接繼承自 DirectoryIterator。

在我的測試中,我預期會得到一個完整的 Unix 路徑。可惜...並不如預期。

<?php
// 假設 $folder = C:\projects\lang

$flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS;
$d_iterator = new RecursiveDirectoryIterator($folder, $flags);

echo
$d_iterator->getPath();

?>

預期結果:/projects/lang (或 C:/projects/lang)
實際結果:C:\projects\lang
To Top