顯示目錄中除了 "." 和 ".." 之外的所有檔案和目錄。
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
(PHP 5, PHP 7, PHP 8)
DirectoryIterator 類別提供了一個簡單的介面,用於檢視檔案系統目錄的內容。
$mode
= "r", 布林值 $useIncludePath
= false
, ?資源 $context
= null
): SplFileObject顯示目錄中除了 "." 和 ".." 之外的所有檔案和目錄。
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
DirectoryIterator 只是一個輕量級的 SplFileInfo 迭代器,其方法作用於內部游標指向的任何項目。換句話說
<?php
$iterator = new DirectoryIterator('C:\\');
echo $iterator->getPathname();
?>
... 並不會印出 "C:\",而是會印出第一個被擷取的檔案或子目錄的路徑,例如 "C:\$Recycle.Bin"。
根據更新日誌(尚未記錄),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;
}
}
}
?>
使用 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