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

use CodeIgniter\Files\FileCollection;

$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

use CodeIgniter\Files\FileCollection;

$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)).