The Finder Component¶
The Finder Component finds files and directories via an intuitive fluent interface.
Installation¶
You can install the component in many different ways:
- Use the official Git repository (https://github.com/symfony/Finder);
- Install it via PEAR ( pear.symfony.com/Finder);
- Install it via Composer (symfony/finder on Packagist).
Usage¶
The Symfony\Component\Finder\Finder
class finds files and/or
directories:
use Symfony\Component\Finder\Finder;
$finder = new Finder();
$finder->files()->in(__DIR__);
foreach ($finder as $file) {
// Print the absolute path
print $file->getRealpath()."\n";
// Print the relative path to the file, omitting the filename
print $file->getRelativePath()."\n";
// Print the relative path to the file
print $file->getRelativePathname()."\n";
}
The $file
is an instance of Symfony\Component\Finder\SplFileInfo
which extends :phpclass:`SplFileInfo` to provide methods to work with relative
paths.
The above code prints the names of all the files in the current directory recursively. The Finder class uses a fluent interface, so all methods return the Finder instance.
Tip
A Finder instance is a PHP Iterator. So, instead of iterating over the
Finder with foreach
, you can also convert it to an array with the
:phpfunction:`iterator_to_array` method, or get the number of items with
:phpfunction:`iterator_count`.
Criteria¶
Location¶
The location is the only mandatory criteria. It tells the finder which directory to use for the search:
$finder->in(__DIR__);
Search in several locations by chaining calls to :method:`Symfony\\Component\\Finder\\Finder::in`:
$finder->files()->in(__DIR__)->in('/elsewhere');
Exclude directories from matching with the :method:`Symfony\\Component\\Finder\\Finder::exclude` method:
$finder->in(__DIR__)->exclude('ruby');
As the Finder uses PHP iterators, you can pass any URL with a supported protocol:
$finder->in('ftp://example.com/pub/');
And it also works with user-defined streams:
use Symfony\Component\Finder\Finder;
$s3 = new \Zend_Service_Amazon_S3($key, $secret);
$s3->registerStreamWrapper("s3");
$finder = new Finder();
$finder->name('photos*')->size('< 100K')->date('since 1 hour ago');
foreach ($finder->in('s3://bucket-name') as $file) {
// do something
print $file->getFilename()."\n";
}
Note
Read the Streams documentation to learn how to create your own streams.
Files or Directories¶
By default, the Finder returns files and directories; but the :method:`Symfony\\Component\\Finder\\Finder::files` and :method:`Symfony\\Component\\Finder\\Finder::directories` methods control that:
$finder->files();
$finder->directories();
If you want to follow links, use the followLinks()
method:
$finder->files()->followLinks();
By default, the iterator ignores popular VCS files. This can be changed with
the ignoreVCS()
method:
$finder->ignoreVCS(false);
Sorting¶
Sort the result by name or by type (directories first, then files):
$finder->sortByName();
$finder->sortByType();
Note
Notice that the sort*
methods need to get all matching elements to do
their jobs. For large iterators, it is slow.
You can also define your own sorting algorithm with sort()
method:
$sort = function (\SplFileInfo $a, \SplFileInfo $b)
{
return strcmp($a->getRealpath(), $b->getRealpath());
};
$finder->sort($sort);
File Name¶
Restrict files by name with the :method:`Symfony\\Component\\Finder\\Finder::name` method:
$finder->files()->name('*.php');
The name()
method accepts globs, strings, or regexes:
$finder->files()->name('/\.php$/');
The notNames()
method excludes files matching a pattern:
$finder->files()->notName('*.rb');
File Size¶
Restrict files by size with the :method:`Symfony\\Component\\Finder\\Finder::size` method:
$finder->files()->size('< 1.5K');
Restrict by a size range by chaining calls:
$finder->files()->size('>= 1K')->size('<= 2K');
The comparison operator can be any of the following: >
, >=
, <
, ‘<=’,
‘==’.
The target value may use magnitudes of kilobytes (k
, ki
), megabytes
(m
, mi
), or gigabytes (g
, gi
). Those suffixed with an i
use
the appropriate 2**n
version in accordance with the IEC standard.
File Date¶
Restrict files by last modified dates with the :method:`Symfony\\Component\\Finder\\Finder::date` method:
$finder->date('since yesterday');
The comparison operator can be any of the following: >
, >=
, <
, ‘<=’,
‘==’. You can also use since
or after
as an alias for >
, and
until
or before
as an alias for <
.
The target value can be any date supported by the strtotime function.
Directory Depth¶
By default, the Finder recursively traverse directories. Restrict the depth of traversing with :method:`Symfony\\Component\\Finder\\Finder::depth`:
$finder->depth('== 0');
$finder->depth('< 3');
Custom Filtering¶
To restrict the matching file with your own strategy, use :method:`Symfony\\Component\\Finder\\Finder::filter`:
$filter = function (\SplFileInfo $file)
{
if (strlen($file) > 10) {
return false;
}
};
$finder->files()->filter($filter);
The filter()
method takes a Closure as an argument. For each matching file,
it is called with the file as a Symfony\Component\Finder\SplFileInfo
instance. The file is excluded from the result set if the Closure returns
false
.