【问题标题】:Scanning directories and getting all files in PHP扫描目录并获取 PHP 中的所有文件
【发布时间】:2016-09-02 13:56:20
【问题描述】:

我的问题是,我有 4 个目录:

/dir1/
/dir2/
/dir3/
/dir4/

可能包含任意数量的子目录,例如:

    /dir1/
       /subdir1/
       /subdir2/

    /dir2/
       /subdir1/
       /subdir2/
       /subdir3/

    /dir3/
       /subdir1/

    /dir4/
       /subdir1/
       /subdir2/
       /subdir3/

这些子目录,可能包含任意数量的 .txt 文件,例如:

/dir1/
   /subdir1/
      /1.txt
      /2.txt
   /subdir2/
      /1.txt

    /dir2/
       /subdir1/
          /1.txt
       /subdir2/
          /1.txt
          /2.txt
       /subdir3/
          /1.txt

    /dir3/
       /subdir1/
          /1.txt
          /2.txt

    /dir4/
       /subdir1/
          /1.txt
       /subdir2/
          /1.txt
       /subdir3/
          /1.txt
          /2.txt
          /3.txt

问题在于以自动方式查找这些 .txt 文件。

重要提示:目录只有 2 级,如上所示。 到目前为止,我已经成功了:

/Applications/MAMP/htdocs/test/public/dir1/.
/Applications/MAMP/htdocs/test/public/dir1/..
/Applications/MAMP/htdocs/test/public/dir1/subdir1/1.txt
/Applications/MAMP/htdocs/test/public/dir1/subdir1/1.txt
/Applications/MAMP/htdocs/test/public/dir1/subdir2/1.txt
/Applications/MAMP/htdocs/test/public/dir1/subdir2/1.txt

与:

$path = realpath('/dir1');
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
                $files[] = $filename;
            }

for ($i=0; $i < count($files); $i++) {
    echo $files[$i] . "<br>";
}

路径数组,例如array(sub1/1.txt, sub1/2.txt, sub2/1.txt ...) 也将不胜感激。 欢迎任何帮助。

【问题讨论】:

    标签: php scandir


    【解决方案1】:

    你的意思是这样的吗?

    更新

    <?php
    
    function scanDirectory($directory) {
    
        $files = glob($directory . '/*');
    
        $data = array();
        foreach ($files as $file) {
            if (is_dir($file)) {
                $data = array_merge($data, scanDirectory($file));
            } else if (substr($file,-4) == '.txt') {
                $data[] = $file;
            }
        }
    
        return $data;
    }
    
    $startDirectory = realpath(__DIR__);
    
    $data = scanDirectory($startDirectory);
    
    var_dump($data);
    
    ?>
    

    【讨论】:

    • 甚至有可能得到一个不错的路径数组吗?如array("sub1/1.txt", "sub2/1.txt" ... ) ?
    【解决方案2】:

    由于您使用的是 RecursiveDirectoryIterator,您应该看看globiterator,它可以帮助您遍历目录和匹配文件。

    编辑: 如文档中所述:

    以与 glob() 类似的方式遍历文件系统。

    您可以轻松地遍历匹配模式的文件:

    $it = new GlobIterator('./*/*.txt');
    foreach($it as $item){
        var_dump($item->getFilename());
    }
    

    【讨论】:

    • 始终欢迎提供指向潜在解决方案的链接,但add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部站点的链接是Why and how are some answers deleted?. 的一个可能原因
    • @jmattheis 适当指出。我添加了链接中的引用和与问题相关的示例。感谢您的评论和链接,它们很有趣。