thomascirca
thomascirca

Reputation: 933

Having troubling listing subdirectories recursively in PHP

I have the following code snippet. I'm trying to list all the files in a directory and make them available for users to download. This script works fine with directories that don't have sub-directories, but if I wanted to get the files in a sub-directory, it doesn't work. It only lists the directory name. I'm not sure why the is_dir is failing on me... I'm a bit baffled on that. I'm sure that there is a better way to list all the files recursively, so I'm open to any suggestions!

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;               
            }                       
    }
}

Upvotes: 2

Views: 300

Answers (2)

Seldaek
Seldaek

Reputation: 42026

You should use RecursiveDirectoryIterator, but you might also want to consider using the Finder component from Symfony2. It allows for easy on the fly filtering (by size, date, ..), including dirs or files, excluding dirs or dot-files, etc. Look at the docblocks inside the Finder.php file for instructions.

Upvotes: 0

alexn
alexn

Reputation: 58962

Instead of using DirectoryIterator, you can use RecursiveDirectoryIterator, which provides functionality for iterating over a file structure recursively. Example from documentation:

$path = realpath('/etc');

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

This prints a list of all files and directories under $path (including $path ifself). If you want to omit directories, remove the RecursiveIteratorIterator::SELF_FIRST part.

Upvotes: 4

Related Questions