两行代码:列举目录和子目录文件

编辑于 2017-02-21

* 移动设备下, 可左滑手指以查看较宽代码

你没有看错。

代码

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.'));
foreach ($it as $v) echo "$v\n";

就上面两行 PHP 代码即可列举出当前目录和子目录的所有文件。

甚至可以套一个正则匹配器,找出后缀是 php 的文件:

$Directory = new RecursiveDirectoryIterator('path/to/project/');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);

解释

其中RecursiveDirectoryIterator是列举目录的迭代器(迭代器是一种设计模式),如果使用 “RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS)” 则可以跳过 . 和 .. 两种目录。具体细节参阅 官网文档 即可。

RecursiveIteratorIterator顾名思义是迭代器的迭代器,这里通过前一个迭代器形成了目录树。其后可选带四个参数(只能任一):

  • RecursiveIteratorIterator::LEAVES_ONLY

    默认就是这个 ,已在 __construct 中默认使用,作用是去枝留叶,跳过空节点,只递归取实值。具体就是:

    1)递归文件夹取文件时跳过文件夹本身,只取文件夹下面的文件
    2)多维数组就跳过前几维的 key,而取 value,输出的每一项都不是 array
    3)XML 只取值 (text),不输出节点名

  • RecursiveIteratorIterator::SELF_FIRST

    各项都包含,例如递归文件夹就会连同子文件夹名称也作为其中项输出,顺序是先父后子。

  • RecursiveIteratorIterator::CHILD_FIRST

    同上,但顺序是先子后父,./test/test.php 会在 ./test(文件夹)前面。

  • RecursiveIteratorIterator::CATCH_GET_CHILD

    未知。