PHP 5 引入 DirectoryIterator 及 SPL 迭代器,提供物件導向、鏈式操作、記憶體效率更好的目錄處理方式。
<?php
$dir = new DirectoryIterator(__DIR__); // 當前目錄
foreach ($dir as $fileinfo) {
// 跳過 . 和 ..
if ($fileinfo->isDot()) continue;
echo $fileinfo->getFilename() . ' ';
echo $fileinfo->isDir() ? '[DIR]' : '[FILE]';
echo ' Size: ' . $fileinfo->getSize() . ' bytes';
echo ' Modified: ' . date('Y-m-d H:i:s', $fileinfo->getMTime());
echo "\n";
}
?>
| 方法 | 說明 | 回傳型別 |
|---|---|---|
getFilename() | 檔名(含副檔名) | string |
getPathname() | 完整路徑 | string |
getPath() | 目錄路徑(不含檔名) | string |
isFile() | 是否為一般檔案 | bool |
isDir() | 是否為目錄 | bool |
isLink() | 是否為符號連結 | bool |
isReadable() | 是否可讀 | bool |
isWritable() | 是否可寫 | bool |
isExecutable() | 是否可執行 | bool |
getSize() | 檔案大小(位元組) | int |
getMTime() | 最後修改時間(Unix 時間戳) | int |
getPerms() | 權限(八進位) | int |
getOwner() | 擁有者 UID | int |
getGroup() | 群組 GID | int |
<?php
// 遞迴掃描所有 PHP 檔案
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(__DIR__,
RecursiveDirectoryIterator::SKIP_DOTS)
);
$phpFiles = new RegexIterator($iterator, '/\.php$/i');
foreach ($phpFiles as $file) {
echo $file->getPathname() . ' (' . $file->getSize() . " bytes)\n";
}
// 計算目錄總大小
$totalSize = 0;
foreach (new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/var/www', RecursiveDirectoryIterator::SKIP_DOTS)
) as $file) {
if ($file->isFile()) $totalSize += $file->getSize();
}
echo "Total: " . number_format($totalSize / 1024 / 1024, 2) . " MB";
?>
<?php
$file = new SplFileInfo('/path/to/file.jpg');
// 等同 stat() 陣列但更方便
echo $file->getSize(); // 大小
echo $file->getMTime(); // 修改時間
echo $file->getExtension(); // 副檔名
echo $file->getBasename(); // 檔名
echo $file->getBasename('.jpg'); // 不含副檔名
echo $file->isReadable(); // 權限檢查
?>
opendir() / readdir() / closedir() → DirectoryIteratorscandir() → DirectoryIterator + iterator_to_array()glob() → GlobIteratorpathinfo() → SplFileInfo::getExtension() 等