【问题标题】:How to make a function find a file through multiple directories?如何使函数通过多个目录查找文件?
【发布时间】:2009-12-26 23:51:18
【问题描述】:

PHP中是否有一种“高性能”的方式来通过多个目录搜索文件?

假设我知道该文件可能位于搜索路径之一中:

$pathOne、$pathTwo、$pathThree。但是现在让我们想象一下,用户(使用框架的开发人员)也能够将他的东西分组到子文件夹中。 $pathTwo 包含 20 个子文件夹,每个子文件夹又包含 2 个子文件夹。

如何在所有这些路径和子文件夹中搜索 $file?我已经看到一些框架过度使用 file_exists() 函数来执行类似的操作(但没有搜索子文件夹)。可能我需要一种方法来确定那里有哪些文件夹,然后进入它们?

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以使用 SPL 库中的 RecursiveDirectoryIterator

    $dir_iterator = new RecursiveDirectoryIterator("/path");
    $iterator = new RecursiveIteratorIterator($dir_iterator,
                        RecursiveIteratorIterator::SELF_FIRST);
    
    foreach ($iterator as $file) {
        echo $file, "\n";
    }
    

    上面的代码会打印出你指定目录中所有文件的列表,包括所有子目录。您可以稍微更改foreach() 循环以执行文件匹配逻辑以找到您要查找的文件,如下所示:

    $dir_iterator = new RecursiveDirectoryIterator("/path");
    $iterator = new RecursiveIteratorIterator($dir_iterator,
                        RecursiveIteratorIterator::SELF_FIRST);
    
    foreach ($iterator as $splFile) {
        if ($splFile->getBaseName() == $file) {
            echo "Found it";
            //do stuff
            break;
        }
    }
    

    省去了自己找出所有文件和目录的大量工作。

    【讨论】:

    • 不需要目录时可以省略 SELF_FIRST,也可以在 FilterIterator 中检查文件名。
    • 请问,你能举个例子吗?我不能让它那样工作。
    • @openfrog - 第二个代码块是一个完整的工作示例,如果您只更改第一行的“/path”就可以正常工作。你遇到了什么问题?
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多