一个非常灵活的函数,可以递归地列出目录中的所有文件,并可以选择对这些文件执行自定义操作集,或者在返回的数据中包含有关它们的额外信息。
----------
语法
$array = process_dir ( $dir , $recursive = FALSE )
$dir (字符串) = 要处理的目录
$recursive (布尔值) = [可选] 递归,如果设置为 TRUE
返回值
该函数返回一个索引数组,每个文件一个条目。每个条目都是一个关联数组,包含基本信息 'filename'(文件名称)和 'dirpath'(文件路径的目录部分),以及您配置的任何其他键。在失败时返回 FALSE。
----------
为了允许您配置另一个键,每个文件的条目都存储在一个数组中,对于每次迭代都是 "$entry"。您可以使用 $entry['keyname'] = ... 轻松地返回给定文件的任何其他数据(注意,此数据可以是任何变量类型 - 字符串、布尔值、浮点数、资源等)。
有一个字符串变量 "$path" 可用,它包含当前文件的完整路径,相对于函数调用时提供的初始 "$dir"。此数据也以其组成部分的形式可用,"$dir" 和 "$file"。可以根据这些变量构建每个文件的操作。变量 "$list"、"$handle" 和 "$recursive" 不应在您的代码中使用。
----------
只需将您的代码插入下面注释指示的部分,然后就完成了!
以下示例返回所有项目的 filename、filepath 和 file modified time(以人类可读的字符串形式),返回所有文件(但不包括目录)的文件大小,以及所有包含 "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']);
}
}
?>