如何使用php计算服务器中子文件夹中的所有文件夹,文件和文件?
我想计算路径/home1/example/public_html/
首先我使用此代码
<?php
$directory = "/home1/example/public_html/";
$filecount = 0;
$files = glob($directory . "*");
if ($files){
$filecount = count($files);
}
echo "There were $filecount files";
?>
显示There were 561 files
然后我使用此代码
<?php
$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
?>
显示There were 566 Files
最后我使用此代码
<?php
// integer starts at 0 before counting
$i = 0;
$dir = '/home1/example/public_html/';
if ($handle = opendir($dir)) {
while (($file = readdir($handle)) !== false){
if (!in_array($file, array('.', '..')) && !is_dir($dir.$file))
$i++;
}
}
// prints out how many were in the directory
echo "There were $i files";
?>`
显示There were 500 Files
但结果不同。
我在/home1/example/public_html/images/
中通过创建文件进行测试但是所有结果在我创建文件之前仍然显示相同。
我该怎么办?
答案 0 :(得分:0)
您的第二个示例将返回比第一个更准确的答案,因为glob
会忽略隐藏文件,而FilesystemIterator
则不会。
第三个例子的最大区别在于,在#1和#2中你正在迭代然后计算文件和目录,在#3中,你正在过滤计数中的目录(通过调用is_dir
) 。
所以#3可能是正确的(除了我在下面的注释中提到的内容),我建议使用#2的变体,这将更容易阅读:
function recursive_file_count($dir)
{
$fi = new FilesystemIterator($dir, FilesystemIterator::SKIP_DOTS);
$c = 0;
foreach ($fi as $fileInfo)
{
if (!$fileInfo->isDir()) { ++$c; }
// can also test for $fileInfo->isLink() if needed
}
return $c;
}
注意:计数也受文件系统权限的影响。因此,例如,如果此脚本在httpd用户下的Apache中运行,并且httpd对某个目录没有执行权限,则它将无法进入该目录并计算其文件。没有某种邪恶的特权升级黑客,就没有办法解决这个问题。