获取递归目录中的特定文件

时间:2013-12-23 22:52:34

标签: php recursion spl

通过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 }

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

1 个答案:

答案 0 :(得分:3)

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

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

在您的情况下,工作是 little 更多涉及,因为您当前使用的代码将永远不会返回任何匹配的文件进行迭代。首先,让我们看看应该有什么用。

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

关键的改变主要是:

  • RecursiveDirectoryIterator::KEY_AS_FILENAME的{​​{1}}标记,与
  • 结合使用
  • RegexIterator`的RecursiveDirectoryIterator标志

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

简而言之,SplFileInfoKEY_AS_FILENAME标志意味着正则表达式只处理每个文件的文件名。耶!

您可能还注意到我在USE_KEY模式下使用了RegexIterator。这意味着在循环匹配的文件时,我们可以完全访问每个RegexIterator::MATCH对象。这给了我们更多的东西,而不仅仅是一个文件名为SplFileInfo的字符串。

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

RegexIterator::GET_MATCH

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