文件集合

处理文件组可能很麻烦,因此框架提供了 FileCollection 类来方便地在整个文件系统中定位和处理文件组。

基本用法

在最基本的情况下,FileCollection 是您设置或构建的文件索引

<?php

use CodeIgniter\Files\FileCollection;

$files = new FileCollection([
    FCPATH . 'index.php',
    ROOTPATH . 'spark',
]);
$files->addDirectory(APPPATH . 'Filters');

在您输入要处理的文件后,您可以删除文件或使用过滤命令来删除或保留与特定正则表达式或 glob 样式模式匹配的文件

<?php

$files->removeFile(APPPATH . 'Filters/DevelopToolbar');

$files->removePattern('#\.gitkeep#');
$files->retainPattern('*.php');

当您的集合完成时,您可以使用 get() 来检索最终的文件路径列表,或者利用 FileCollection 可计数且可迭代的特性直接处理每个 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());
}

以下是使用 FileCollection 的特定方法。

开始一个集合

__construct(string[] $files = [])

构造函数接受一个可选的文件路径数组,用作初始集合。这些路径将传递给 add(),因此子类在 $files 中提供的任何文件都将保留。

define()

允许子类定义自己的初始文件。此方法由构造函数调用,允许预定义集合,而无需使用它们的方法。示例

<?php

use CodeIgniter\Files\FileCollection;

class ConfigCollection extends FileCollection
{
    protected function define(): void
    {
        $this->add(APPPATH . 'Config', true)->retainPattern('*.php');
    }
}

现在您可以在项目的任何地方使用 ConfigCollection 来访问所有应用程序配置文件,而无需每次都重新调用集合方法。

set(array $files)

将输入文件列表设置为提供的文件路径字符串数组。这将从集合中删除任何现有文件,因此 $collection->set([]) 本质上是一个硬重置。

输入文件

add(string[]|string $paths, bool $recursive = true)

添加路径或路径数组指示的所有文件。如果路径解析为目录,则 $recursive 将包括子目录。

addFile(string $file) / addFiles(array $files)

将文件或文件添加到当前的输入文件列表中。文件是实际文件的绝对路径。

removeFile(string $file) / removeFiles(array $files)

从当前的输入文件列表中删除文件或文件。

addDirectory(string $directory, bool $recursive = false)

addDirectories(array $directories, bool $recursive = false)

添加来自目录或目录的所有文件,可以选择递归到子目录。目录是实际目录的绝对路径。

过滤文件

removePattern(string $pattern, string $scope = null)

retainPattern(string $pattern, string $scope = null)

通过模式(以及可选范围)过滤当前文件列表,删除或保留匹配的文件。 $pattern 可以是完整的正则表达式(如 '#[A-Za-z]+\.php#')或类似于 glob() 的伪正则表达式(如 *.css)。如果提供了 $scope,则只考虑该目录及其子目录中的文件(即,始终保留 $scope 之外的文件)。如果没有提供范围,则所有文件都将被考虑。

示例

<?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

检索文件

get(): string[]

返回所有已加载的输入文件的数组。

注意

FileCollection 是一个 IteratorAggregate,因此您可以直接使用它(例如 foreach ($collection as $file))。