计算目录中的文件,但排除子目录

时间:2013-12-07 17:05:44

标签: php directory

我发现了一个旧帖子,其中包含几乎完美的问题代码:计算目录中的(多个)文件。它排除了。 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版本,并会再试一次。

谢谢大家的贡献!!!

5 个答案:

答案 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));