一個非常彈性的函式,可以遞迴列出目錄中的所有檔案,並可選擇對這些檔案執行一組自訂動作,和/或在返回的資料中包含關於它們的額外資訊。
----------
語法
$array = process_dir ( $dir , $recursive = FALSE )
$dir (字串) = 要處理的目錄
$recursive (布林值) = [選用] 設為 TRUE 則遞迴處理
回傳值
此函式會回傳一個索引陣列,每個檔案都佔一個項目。每個項目是一個關聯陣列,包含基本資訊 'filename'(檔案名稱)和 'dirpath'(檔案路徑的目錄部分),以及您設定的任何額外鍵值。失敗時回傳 FALSE。
----------
為了讓您可以設定其他鍵值,每個檔案的項目會儲存在一個陣列 "$entry" 中,每次迭代都會使用。您可以使用 $entry['keyname'] = ... 輕鬆地為指定檔案回傳任何額外資料(請注意,此資料可以是任何變數類型 - 字串、布林值、浮點數、資源等)
有一個字串變數 "$path" 可用,其中包含目前檔案的完整路徑,相對於函式呼叫時提供的初始 "$dir"。此資料也可以在其組成部分 "$dir" 和 "$file" 中取得。每個檔案的動作可以根據這些變數建構。變數 "$list"、"$handle" 和 "$recursive" 不應在您的程式碼中使用。
----------
只需將您的程式碼插入下方註釋指示的部分,就可以開始使用了!
以下範例會回傳所有項目的檔案名稱、檔案路徑和檔案修改時間(以人類可讀的字串表示),所有檔案(但不包括目錄)的檔案大小,以及檔名中包含 'log' 的所有檔案(但不包括 *.log 檔案)的資源串流。
<?php
function process_dir($dir,$recursive = FALSE) {
if (is_dir($dir)) {
for ($list = array(),$handle = opendir($dir); (FALSE !== ($file = readdir($handle)));) {
if (($file != '.' && $file != '..') && (file_exists($path = $dir.'/'.$file))) {
if (is_dir($path) && ($recursive)) {
$list = array_merge($list, process_dir($path, TRUE));
} else {
$entry = array('filename' => $file, 'dirpath' => $dir);
$entry['modtime'] = filemtime($path);
do if (!is_dir($path)) {
$entry['size'] = filesize($path);
if (strstr(pathinfo($path,PATHINFO_BASENAME),'log')) {
if (!$entry['handle'] = fopen($path,r)) $entry['handle'] = "FAIL";
}
break;
} else {
break;
} while (FALSE);
$list[] = $entry;
}
}
}
closedir($handle);
return $list;
} else return FALSE;
}
$result = process_dir('C:/webserver/Apache2/httpdocs/processdir',TRUE);
foreach ($result as $file) {
if (is_resource($file['handle'])) {
echo "\n\nFILE (" . $file['dirpath'].'/'.$file['filename'] . "):\n\n" . fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
fclose($file['handle']);
}
}
?>