首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 統計目錄文件數量:遞歸與非遞歸實現

     編輯:PHP 綜合知識

獲取目錄下文件總數是常見需求。本文提供多種實現方式,並修正原代碼中的邏輯錯誤。

修正版:非遞歸統計(僅當前目錄)

<?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');
?>

SPL 迭代器版(現代、高效、可過濾)

<?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()簡潔、返回數組大目錄內存壓力大小目錄快速獲取列表

glob() 簡潔版

$count = count(glob('./pic/*', GLOB_NOSORT)); // 僅文件
$count = count(glob('./pic/{*,.*}', GLOB_BRACE)); // 含隱藏文件

注意事項

  1. 權限:確保 PHP 進程對目錄有讀取/執行權限
  2. 符號鏈接:RecursiveDirectoryIterator::FOLLOW_SYMLINKS 控制是否跟隨
  3. 大目錄性能:避免在百萬級文件目錄同步統計,考慮緩存或異步
  4. 編碼:Windows 中文路徑可能需 iconv 轉換

推薦使用 SPL 迭代器體系,代碼更健壯、可維護、功能更強大。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved