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

PHP 遍歷目錄下所有檔案完整代碼範例

     編輯:PHP 綜合知識

基本遍歷代碼

<?php
// 設定內容編碼
header("Content-Type: text/html; charset=utf-8");

// 開啟目錄句柄(以 C 槽為例)
$handle = opendir('C:\\');
echo "目錄句柄: $handle <br/>";
echo "檔案列表: <br/>";

while ($file = readdir($handle)) {
    // Windows XP 預設編碼為 GBK,轉換為 UTF-8 顯示
    $file = iconv('GB2312', 'UTF-8', $file);
    echo "$file <br/>";
}

closedir($handle);
?>

關鍵函數說明

函數用途
opendir(path)開啟目錄句柄,返回資源標識符
readdir(handle)讀取目錄下一個檔案/資料夾名稱,到達末尾返回 false
closedir(handle)關閉目錄句柄,釋放資源
iconv(in, out, str)字元編碼轉換,此處將 GB2312/GBK 轉為 UTF-8

進階版:遞迴遍歷子目錄並過濾特定檔案

<?php
function listFiles($dir, $ext = null) {
    $files = array();
    $handle = opendir($dir);
    
    while (($file = readdir($handle)) !== false) {
        if ($file === '.' || $file === '..') continue;
        
        $path = $dir . DIRECTORY_SEPARATOR . $file;
        
        if (is_dir($path)) {
            // 遞迴處理子目錄
            $files = array_merge($files, listFiles($path, $ext));
        } elseif (is_file($path)) {
            // 擴充名過濾
            if ($ext === null || in_array(pathinfo($path, PATHINFO_EXTENSION), (array)$ext)) {
                $files[] = $path;
            }
        }
    }
    closedir($handle);
    return $files;
}

// 使用範例:獲取 D:\www 目錄下所有 .php 和 .html 檔案
$phpFiles = listFiles('D:\\www', array('php', 'html'));
foreach ($phpFiles as $file) {
    echo $file . '<br/>';
}
?>

現代寫法(PHP 5.3+):使用 SPL 迭代器

<?php
$dir = 'C:\\';
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
);

foreach ($iterator as $fileInfo) {
    if ($fileInfo->isFile()) {
        // 自動處理編碼問題(PHP 內部使用系統編碼)
        echo $fileInfo->getPathname() . '<br/>';
    }
}
?>

常見問題與注意事項

  • 編碼問題:Windows 系統目錄列表通常為 GBK/CP936 編碼,輸出到 UTF-8 網頁必須 iconv 轉碼,否則中文檔名顯示亂碼。
  • 權限問題:嘗試讀取無權限目錄(如 C:\System Volume Information)會產生警告,建議加 @ 抑制或使用 try-catch。
  • 路徑分隔符:Windows 接受 \\ 或 /,建議使用常量 DIRECTORY_SEPARATOR 增加跨平台相容性。
  • 效能考量:遍歷大量檔案(如整個 C 槽)極其緩慢且佔用大量記憶體,生產環境請限制遍歷深度或使用快取機制。

總結

基本 opendir/readdir/closedir 三件套適合簡單單層遍歷;遞迴函數適合需要過濾條件的多層遍歷;SPL 迭代器物件導向風格更強,自動處理遞迴與跳過 ./..,是現代 PHP 專案的推薦寫法。

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