一个非常灵活的函数,可以递归列出目录中的所有文件,并可以选择对这些文件执行自定义的操作集和/或在返回的数据中包含有关它们的额外信息。
----------
语法
$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\n文件 (" . $file['dirpath'].'/'.$file['filename'] . "):\n\n" . fread($file['handle'], filesize($file['dirpath'].'/'.$file['filename']));
fclose($file['handle']);
}
}
?>