<?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
$dir = 'C:\\';
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS)
);
foreach ($iterator as $fileInfo) {
if ($fileInfo->isFile()) {
// 自動處理編碼問題(PHP 內部使用系統編碼)
echo $fileInfo->getPathname() . '<br/>';
}
}
?>
iconv 轉碼,否則中文檔名顯示亂碼。C:\System Volume Information)會產生警告,建議加 @ 抑制或使用 try-catch。\\ 或 /,建議使用常量 DIRECTORY_SEPARATOR 增加跨平台相容性。基本 opendir/readdir/closedir 三件套適合簡單單層遍歷;遞迴函數適合需要過濾條件的多層遍歷;SPL 迭代器物件導向風格更強,自動處理遞迴與跳過 ./..,是現代 PHP 專案的推薦寫法。