在PHP中递归地列出子目录

时间:2011-06-12 20:41:21

标签: php recursion

我有以下代码段。我正在尝试列出目录中的所有文件,并使其可供用户下载。此脚本适用于没有子目录的目录,但如果我想将文件放在子目录中,则它不起作用。它只列出目录名称。我不确定为什么is_dir对我失败了...我对此感到有点困惑。我确信有更好的方法可以递归列出所有文件,所以我愿意接受任何建议!

function getLinks ($folderName, $folderID) {
$fileArray = array();

foreach (new DirectoryIterator(<some base directory> . $folderName) as $file) {
    //if its not "." or ".." continue
    if (!$file->isDot()) {              
            if (is_dir($file)) {                     
                $tempArray = getLinks($file . "/", $folderID);
                array_merge($fileArray, $tempArray);

            } else {
                $fileName = $file->getFilename();                           
             $url = getDownloadLink($folderID, $fileName);
             $fileArray[] = $url;               
            }                       
    }
}

2 个答案:

答案 0 :(得分:4)

您可以使用RecursiveDirectoryIterator代替使用DirectoryIterator,它提供了递归迭代文件结构的功能。文档示例:

$path = realpath('/etc');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo "$name\n";
}
  

这将打印所有文件的列表   $ path下的目录(包括   $ path ifself)。如果你想省略   目录,删除   RecursiveIteratorIterator :: SELF_FIRST   一部分。

答案 1 :(得分:0)

您应该使用RecursiveDirectoryIterator,但您可能还需要考虑使用Symfony2中的Finder组件。它允许轻松实时过滤(按大小,日期,...),包括目录或文件,不包括目录或点文件等。请查看Finder.php文件中的docblock以获取说明。