Symfony 7.4 中用 Finder 统计目录文件数简洁高效:调用 files()->in($path)->count() 或 iterator_count() 即可;支持链式过滤(如排除 .git、限制扩展名)、内存友好且无需递归遍历。

<p>在 Symfony 7.4 中,用 <code>Finder</code> 统计目录下总文件数非常简洁高效,无需手动递归遍历或调用 shell 命令。</p>
<H3>基础统计:所有常规文件(不含目录)</H3>
<p><code>Finder</code> 默认只匹配文件(<code>File</code> 对象),跳过目录。只需指定路径并调用 <code>count()</code>:</p>
<pre><code class="php">use Symfony\Component\Finder\Finder;
$finder = new Finder();
$finder->files()->in('/path/to/your/directory');
$totalFiles = iterator_count($finder); // 或 $finder->count()
echo "共 {$totalFiles} 个文件\n";
</code></pre>
<p>注意:<code>count()</code> 在 Finder v6+(含 Symfony 7.4)中返回整数,但底层是惰性迭代器,<code>iterator_count()</code> 更明确且兼容性更稳。</p>
<H3>排除特定类型或隐藏文件</H3>
<p>常见需求如跳过 <code>.git</code>、日志、缓存等,可用链式方法精准过滤:</p>
<ul>
<li><code>->notPath('/\.git/') </code> 排除 Git 目录及其内容</li>
<li><code>->notPath('/var\/cache/') </code> 排除缓存目录(注意正斜杠转义)</li>
<li><code>->depth('== 0') </code> 限制仅当前目录(不递归)</li>
<li><code>->name('*.php') </code> 仅统计 PHP 文件</li>
<li><code>->ignoreDotFiles(true) </code> 跳过 <code>.env</code>、<code>.gitignore</code> 等点文件(默认开启)</li>
</ul>
<p>示例:统计项目中所有非隐藏的 PHP 和 Twig 文件数:</p>
<pre><code class="php">$finder = Finder::create()
->files()
->in(__DIR__.'/src')
->name('*.php')
->orX(
Finder::create()->name('*.twig'),
Finder::create()->name('*.html.twig')
)
->notPath('/Tests/')
->notPath('/Fixtures/');
echo "PHP + Twig 文件总数:".iterator_count($finder);
</code></pre>
<H3>性能提示:大数据量目录避免全加载</H3>
<p>当目标目录含数万文件时,<code>Finder</code> 仍保持内存友好——它不一次性读取全部元数据,而是边迭代边匹配。但可进一步优化:</p>
<ul>
<li>用 <code>->followLinks(false)</code> 关闭符号链接追踪(默认关闭,显式声明更安全)</li>
<li>避免无意义的 <code>->sortByName()</code> 或 <code>->sortByModifiedTime()</code>,它们会强制预加载全部结果</li>
<li>若只需总数,不要调用 <code>->getIterator()</code> 后再 foreach ——直接 <code>iterator_count()</code> 最轻量</li>
</ul>
<H3>完整可运行命令脚本(bin/count-files.php)</H3>
<p>放在项目根目录 <code>bin/</code> 下,通过 <code>php bin/count-files.php src</code> 快速使用:</p>
<pre><code class="php">#!/usr/bin/env php
<?php
use Symfony\Component\Finder\Finder;
require_once __DIR__.'/../vendor/autoload.php';
if ($argc < 2) {
echo "用法: php {$argv[0]} <目录路径>\n";
exit(1);
}
$path = $argv[1];
if (!is_dir($path)) {
echo "错误:'{$path}' 不是有效目录。\n";
exit(1);
}
$finder = Finder::create()
->files()
->in($path)
->ignoreDotFiles(true)
->followLinks(false);
$count = iterator_count($finder);
echo "? {$path} 下共 {$count} 个文件\n";
</code></pre>
<p>赋予执行权限:<code>chmod +x bin/count-files.php</code>,之后可直接运行。</p>