【问题标题】:Get specific files in a Recursive Directory获取递归目录中的特定文件
【发布时间】:2013-12-23 22:52:33
【问题描述】:

按照 php.net 手册中的注释给出的示例,我试图在递归目录结构中获取每个名为 file.txt 的文件。

Folder/
  subfold1
   subfold2
     file.txt

   subfold3
     file.txt

等等。是有关文件夹结构的示例。

    $directory = new \RecursiveDirectoryIterator(__DIR__ . '/..');

    $iterator = new \RecursiveIteratorIterator($directory);

    $files = new \RegexIterator($iterator, '/^file.txt$/', \RecursiveRegexIterator::GET_MATCH);

    var_dump($files);

问题是给定的代码给出了以下结果:

object(RegexIterator)#4 (1) { ["replacement"]=> NULL }

我该怎么处理它?我只是在寻找文件和给定的路径,最好是在一个数组中。

【问题讨论】:

    标签: php recursion spl


    【解决方案1】:

    您通常希望迭代 *Iterator 对象,最常见的是使用基本的foreach() 循环。

    foreach ($files as $file) {
        // Do something
    }
    

    在您的情况下,这项工作涉及更多一点,因为您目前使用的代码永远不会返回任何匹配的文件进行迭代。首先,让我们看看应该怎么做。

    $directory = new RecursiveDirectoryIterator(
        __DIR__ . '/..',
        RecursiveDirectoryIterator::KEY_AS_FILENAME | 
        RecursiveDirectoryIterator::CURRENT_AS_FILEINFO
    );
    $files = new RegexIterator(
        new RecursiveIteratorIterator($directory),
        '#^file\.txt$#',
        RegexIterator::MATCH,
        RegexIterator::USE_KEY
    );
    

    关键的带回家的变化是:

    • RecursiveDirectoryIteratorRecursiveDirectoryIterator::KEY_AS_FILENAME 标志,与
    • 结合使用
    • RegexIterator 的 RegexIterator::USE_KEY 标志`

    以前,当迭代器被迭代时,正则表达式将与“当前”迭代器值匹配,在您的情况下,该值是代表每个文件的 SplFileInfo 对象。当转换为字符串时,为了让正则表达式进行匹配,SplFileInfo 对象变成了它们的完整路径;目录和所有。这意味着您的正则表达式永远不会匹配,因为它只需要文件名。

    长话短说,KEY_AS_FILENAMEUSE_KEY 标志意味着正则表达式只处理每个文件的文件名。耶!

    您可能还注意到我在RegexIterator::MATCH 模式下使用了RegexIterator。这意味着在遍历匹配的文件时,我们可以完全访问每个 SplFileInfo 对象。这给了我们更多的乐趣,而不仅仅是RegexIterator::GET_MATCH 提供的文件名字符串。

    要打印每个文件及其完整路径,您可以使用以下内容:

    foreach ($files as $file) {
        echo $file->getPathname() . "\n";
    }
    

    有关可用方法的完整列表,请参阅SplFileInfo documentation

    【讨论】:

      最近更新 更多