Home » Php » php – Using RecursiveIteratorIterator to list files in folder is great. Can I get the parent path and full path as well?

php – Using RecursiveIteratorIterator to list files in folder is great. Can I get the parent path and full path as well?

Posted by: admin July 12, 2020 Leave a comment

Questions:

I need to list all files (which have certain extensions) in a folder and its sub-folders. I used RecursiveIteratorIterator as described in @Matthew ‘s great answer in PHP list all files in directory.

  • I’m setting the root of the search to “..” and all filenames get a prefix of “../”. How can I get the filename only?
  • How can I get, in addition to the filename, its parent folder name?
  • …and how can I get the full path of the filename?

And one last thing: displaying a file-tree, or maybe all directories that have no sub-directories, are both examples of things that one might want to do when dealing with files. How would you recommend to pass this data to the client side and how would the data structure look like?

How to&Answers:

$filename in that answer is actually not a string. It is an object of type SplFileInfo which can be used like a string but it also offers much more detailed info:

Answer:

Using this as a base:

$iter = new RecursiveDirectoryIterator('../');

foreach (new RecursiveIteratorIterator($iter) as $fileName => $fileInfo) {
   $fullPath = (string) $fileInfo;
}

Each $fileInfo will return a SplFileInfo object. The path and filename are easily accessible in addition to a host of other methods.

phpSplFileInfo Object
(
  [pathName:SplFileInfo:private] => ./t.php
  [fileName:SplFileInfo:private] => t.php
)

I may be mistaken, but to access the parent folder name unless you record it through the tree the simplest would be using dirname and appending ../ to the path.

Answer:

<?php
    $iterator = new FilesystemIterator(dirname(__FILE__), FilesystemIterator::CURRENT_AS_PATHNAME);
    foreach ($iterator as $fileinfo) {
        echo $iterator->current()->getPathname() . "\n";
    }
 ?>