利用 glob() 取得路徑匹配的檔案列表,搭配 is_dir() 判斷並遞歸:
<?php
function myscandir($pathname) {
foreach (glob($pathname) as $filename) {
if (is_dir($filename)) {
myscandir($filename . '/*');
} else {
echo $filename . '<br/>';
}
}
}
myscandir('D:/wamp/www/exe1/*');
?>
特點:
. 和 ..,無需額外過濾使用內建 DirectoryIterator 類別(或 dir() 函式)逐項讀取:
<?php
function myscandir($path) {
$mydir = dir($path);
while ($file = $mydir->read()) {
$p = $path . '/' . $file;
if ($file !== "." && $file !== "..") {
echo $p . '<br>';
}
if (is_dir($p) && $file !== "." && $file !== "..") {
myscandir($p);
}
}
}
myscandir(dirname(dirname(__FILE__)));
?>
特點:
. 和 ..FilesystemIterator、RecursiveDirectoryIterator)PHP 5.3+ 推薦使用 SPL 迭代器,一行代碼實現遞歸遍歷:
<?php
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/path/to/dir', RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $file) {
echo $file->getPathname() . '<br/>';
}
?>
| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 小型目錄、簡單腳本 | glob() | 代碼最少,可讀性高 |
| 大量檔案、記憶體敏感 | DirectoryIterator | 流式讀取,常數記憶體 |
| 需檔案屬性、權限、類型判斷 | SplFileInfo / RecursiveDirectoryIterator | 豐富的檔案資訊 API |
| 需過濾特定副檔名 | RegexIterator 包裝 | 靈活的正則過濾 |
is_link() 避免無限循環is_readable() 預檢或 try-catch 處理DIRECTORY_SEPARATOR 常數確保跨平台相容