File Collections
Working with groups of files can be cumbersome, so the framework supplies the FileCollection
class to facilitate
locating and working with groups of files across the filesystem.
Basic Usage
At its most basic, FileCollection
is an index
of files you set or build:
<?php
$files = new FileCollection([
FCPATH . 'index.php',
ROOTPATH . 'spark',
]);
$files->addDirectory(APPPATH . 'Filters');
After you have input the files you would like to work with you may remove files or use the filtering commands to remove or retain files matching a certain regex or glob-style pattern:
<?php
$files->removeFile(APPPATH . 'Filters/DevelopToolbar');
$files->removePattern('#\.gitkeep#');
$files->retainPattern('*.php');
When your collection is complete, you can use get()
to retrieve the final list of file paths, or take advantage of
FileCollection
being countable and iterable to work directly with each File
:
<?php
echo 'My files: ' . implode(PHP_EOL, $files->get());
echo 'I have ' . count($files) . ' files!';
foreach ($files as $file) {
echo 'Moving ' . $file->getBasename() . ', ' . $file->getSizeByUnit('mb');
$file->move(WRITABLE . $file->getRandomName());
}
Below are the specific methods for working with a FileCollection
.
Starting a Collection
__construct(string[] $files = [])
The constructor accepts an optional array of file paths to use as the initial collection. These are passed to
add()
so any files supplied by child classes in the $files
will remain.
define()
Allows child classes to define their own initial files. This method is called by the constructor and allows predefined collections without having to use their methods. Example:
<?php
use CodeIgniter\Files\FileCollection;
class ConfigCollection extends FileCollection
{
protected function define(): void
{
$this->add(APPPATH . 'Config', true)->retainPattern('*.php');
}
}
Now you may use the ConfigCollection
anywhere in your project to access all App Config files without
having to re-call the collection methods every time.
set(array $files)
Sets the list of input files to the provided string array of file paths. This will remove any existing
files from the collection, so $collection->set([])
is essentially a hard reset.
Inputting Files
add(string[]|string $paths, bool $recursive = true)
Adds all files indicated by the path or array of paths. If the path resolves to a directory then $recursive
will include sub-directories.
addFile(string $file) / addFiles(array $files)
Adds the file or files to the current list of input files. Files are absolute paths to actual files.
removeFile(string $file) / removeFiles(array $files)
Removes the file or files from the current list of input files.
addDirectory(string $directory, bool $recursive = false)
addDirectories(array $directories, bool $recursive = false)
Adds all files from the directory or directories, optionally recursing into sub-directories. Directories are absolute paths to actual directories.
Filtering Files
removePattern(string $pattern, string $scope = null)
retainPattern(string $pattern, string $scope = null)
Filters the current file list through the pattern (and optional scope), removing or retaining matched
files. $pattern
may be a complete regex (like '#[A-Za-z]+\.php#'
) or a pseudo-regex similar
to glob()
(like *.css
).
If a $scope
is provided then only files in or under that directory will be considered (i.e. files
outside of $scope
are always retained). When no scope is provided then all files are subject.
Examples:
<?php
$files = new FileCollection();
$files->add(APPPATH . 'Config', true); // Adds all Config files and directories
$files->removePattern('*tion.php'); // Would remove Encryption.php, Validation.php, and boot/production.php
$files->removePattern('*tion.php', APPPATH . 'Config/boot'); // Would only remove boot/production.php
$files->retainPattern('#A.+php$#'); // Would keep only Autoload.php
$files->retainPattern('#d.+php$#', APPPATH . 'Config/boot'); // Would keep everything but boot/production.php and boot/testing.php
Retrieving Files
get(): string[]
Returns an array of all the loaded input files.
Note
FileCollection
is an IteratorAggregate
so you can work with it directly (e.g. foreach ($collection as $file)
).