我发现了一个旧帖子,其中包含几乎完美的问题代码:计算目录中的(多个)文件。它排除了。 en ..条目,但不是其他目录。 我通过添加评论添加了一个问题,但没有得到答复。 (太老的帖子,我想) (Count how many files in directory php)
$fi = new FilesystemIterator(images, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
在php.net上搜索,但很多这个主题没有记录。我确实找到了SKIP_DOTS事实,但没有找到关于如何排除目录的一封信。
现在我的代码产生:有76849个文件 但这也包括子目录。
如何更改此代码,以便排除我的子目录?
由于某些答案而更新
/**
PHP version problem, need update first
$files = new FilesystemIterator('images');
$filter= new CallbackFilterIterator($files, function($cur, $key, $iter) {
return $cur->isFile();
});
printf('There were %d Files', iterator_count($filter));
*/
$time0 = time();
$fi = new FilesystemIterator(images, FilesystemIterator::SKIP_DOTS);
$fileCount = 0;
foreach ($fi as $f) {
if ($f->isFile()) {
$fileCount++;
}
}
printf("xThere were %d Files", $fileCount);
$time1 = time();
echo'<br />tijd 1 = '.($time1 - $time0); // outcome 5
echo'<hr />';
$fi = new FilesystemIterator(images, FilesystemIterator::SKIP_DOTS);
printf("yThere were %d Files", iterator_count($fi));
$time2 = time();
echo'<br />tijd 2 = '.($time2 - $time1); // outcome: 0
我现在无法使用的第一个答案,因为我必须更新我的PHP版本。 在测量时间时,第二个答案需要花费更多的时间来处理。
我还注意到,由于第二个答案,我自己的代码不计算子目录中的文件,它只计算子目录的数量,在我的情况下只有4。 所以对于速度,我将使用我自己的代码和它的4。 下周我尝试更新我的php版本,并会再试一次。
谢谢大家的贡献!!!
答案 0 :(得分:8)
使用CallbackFilterIterators(自5.4起可用)很容易:
$files = new FilesystemIterator('images');
$filter= new CallbackFilterIterator($files, function($cur, $key, $iter) {
return $cur->isFile();
});
printf('There were %d Files', iterator_count($filter));
答案 1 :(得分:2)
更简单,假设文件有扩展名而目录不是:
$count = count(glob('images/*.*'));
或过滤掉目录:
$count = count(array_diff(glob('images/*'), glob('images/*', GLOB_ONLYDIR)));
答案 2 :(得分:1)
我会这样做:
$fi = new FilesystemIterator(images, FilesystemIterator::SKIP_DOTS);
$fileCount = 0;
foreach ($fi as $f) {
if ($f->isFile()) {
$fileCount++;
}
}
printf("There were %d Files", $fileCount);
当你阅读它时,感觉就像是自我记录代码。
答案 3 :(得分:0)
Symfony的“Finder”组件非常灵活,它通过直观的流畅界面查找文件和目录(实际上它是许多SPL组件的包装)。大约30种方法可以配置结果。例如:size,depth,exclude,ignoredotfiles,path,exclude,followLinks ........ 从文档中获取的一个例子:
use Symfony\Component\Finder\Finder ;
$finder = new Finder();
$iterator = $finder
->files()
->name('*.php')
->depth(0)
->size('>= 1K')
->in(__DIR__);
foreach ($iterator as $file) {
print $file->getRealpath()."\n";
}
“文件”组件甚至可以用于远程存储的文件(如亚马逊的S3)。 将“symfony / finder”:“2.3.*@dev”编写到composer.json文件并运行“composer update”CLI命令时,安装非常简单。到目前为止,该组件的安装量已达到140万次,是其质量的最佳证据。许多Frameworks/projects在幕后使用此组件。
答案 4 :(得分:-1)
$ fi = new FilesystemIterator( DIR 。'/ images',FilesystemIterator :: SKIP_DOTS); printf(“有%d个文件”,iterator_count($ fi));