獲取目錄下文件總數是常見需求。本文提供多種實現方式,並修正原代碼中的邏輯錯誤。
<?php
$dir = './pic';
$count = 0;
if (is_dir($dir)) {
$handle = opendir($dir);
while (false !== ($file = readdir($handle))) {
// 排除 . 和 ..
if ($file !== '.' && $file !== '..') {
$count++;
}
}
closedir($handle);
}
echo "文件總數: $count";
?>
關鍵修正:原代碼 if($file !== '.' || $file != '..') 邏輯錯誤,應為 且 關系 &&。
<?php
function countFilesRecursive($dir) {
$count = 0;
$items = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($items as $item) {
if ($item->isFile()) $count++;
}
return $count;
}
echo "遞歸總數: " . countFilesRecursive('./pic');
?>
<?php
// 僅統計 .jpg .png 文件
$count = count(new RegexIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('./pic', RecursiveDirectoryIterator::SKIP_DOTS)
),
'/\.(jpg|png)$/i'
));
echo "圖片數量: $count";
?>
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| opendir/readdir | 底層控制、內存效率高 | 代碼冗長、易出錯 | 簡單單層統計、舊版本兼容 |
| glob() | 模式匹配強大 | 大目錄內存峰值高 | 需模式匹配的非遞歸場景 |
| SPL 迭代器 | 面向對象、可組合過濾、惰性求值 | PHP 5.3+、學習曲線稍陡 | 現代項目、複雜過濾、遞歸遍歷 |
| scandir() | 簡潔、返回數組 | 大目錄內存壓力大 | 小目錄快速獲取列表 |
$count = count(glob('./pic/*', GLOB_NOSORT)); // 僅文件
$count = count(glob('./pic/{*,.*}', GLOB_BRACE)); // 含隱藏文件
RecursiveDirectoryIterator::FOLLOW_SYMLINKS 控制是否跟隨iconv 轉換推薦使用 SPL 迭代器體系,代碼更健壯、可維護、功能更強大。