[英]Count files in directory, but exclude subdirectories
我发现了一个旧帖子,其中包含了我的问题几乎完美的代码:计算目录中的(多个)文件。 它排除了。 en ..条目,但不是其他目录。 我通过添加评论添加了一个问题,但没有得到答复。 (太老的帖子,我想)( 计算目录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版本,并将再试一次。
谢谢大家的贡献!
这很容易使用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));
更简单,假设文件有扩展名,而目录则没有:
$count = count(glob('images/*.*'));
或者过滤掉目录:
$count = count(array_diff(glob('images/*'), glob('images/*', GLOB_ONLYDIR)));
我会这样做:
$fi = new FilesystemIterator(images, FilesystemIterator::SKIP_DOTS);
$fileCount = 0;
foreach ($fi as $f) {
if ($f->isFile()) {
$fileCount++;
}
}
printf("There were %d Files", $fileCount);
当您阅读它时,感觉就像自我记录代码。
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万次,是其质量的最佳证据。 许多框架/项目在幕后使用此组件。
$ fi = new FilesystemIterator( DIR 。'/ images',FilesystemIterator :: SKIP_DOTS); printf(“有%d文件”,iterator_count($ fi));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.