好的,在exec()
函数的帮助下解决了,所以请小心使用!我正在使用 CodeIgniter,所以我directory_helper.php
稍微修改了这个函数,因为它安装在一个 windows 盒子上,它总是需要检查隐藏文件,但它也应该适用于非 codeigniter 站点:
function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE)
{
if ($fp = @opendir($source_dir))
{
if(!$hidden)
{
$exclude = array();
exec('dir "' . $source_dir . '" /ah /B', $exclude);
}
$filedata = array();
$new_depth = $directory_depth - 1;
$source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
while (FALSE !== ($file = readdir($fp)))
{
// Remove '.', '..', and hidden files [optional]
if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.') OR ($hidden === FALSE && in_array($file, $exclude)))
{
continue;
}
if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file))
{
$filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden);
}
else
{
$filedata[] = $file;
}
}
closedir($fp);
return $filedata;
}
return FALSE;
}
这在大约 11 秒内扫描了 2207 个文件和 446 个文件夹(我知道的年龄,但我能做到的最好)。在 500 个文件夹和 200 个文件上进行了测试,大约 3 秒就完成了。
它是一个递归函数,它将扫描每个非隐藏目录。它做的第一件事是使用该exec('dir *directory* /ah /B')
功能扫描当前目录中的所有隐藏文件和文件夹。
然后它将结果存储在一个数组中,并确保正在读取的当前文件/目录不在该数组中。