迭代器
在线手册:中文  英文

The RecursiveDirectoryIterator class

(PHP 5)

简介

The RecursiveDirectoryIterator provides an interface for iterating recursively over filesystem directories.

类摘要

RecursiveDirectoryIterator extends FilesystemIterator implements SeekableIterator , RecursiveIterator {
/* 方法 */
public __construct ( string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ] )
public mixed getChildren ( void )
public string getSubPath ( void )
public string getSubPathname ( void )
public bool hasChildren ([ bool $allow_links = false ] )
public string key ( void )
public void next ( void )
public void rewind ( void )
/* Inherits */
public FilesystemIterator::__construct ( string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS ] )
public mixed FilesystemIterator::current ( void )
public int FilesystemIterator::getFlags ( void )
public string FilesystemIterator::key ( void )
public void FilesystemIterator::next ( void )
public void FilesystemIterator::rewind ( void )
public void FilesystemIterator::setFlags ([ int $flags ] )
}

更新日志

版本 说明
5.3.0 The FilesystemIterator was introduced as the parent class. Previously, the parent was the DirectoryIterator.
5.3.0 Implements SeekableIterator.
5.2.11, 5.3.1 Added RecursiveDirectoryIterator::FOLLOW_SYMLINKS

Table of Contents


迭代器
在线手册:中文  英文

用户评论:

catinahat at cool dot fr dot nf (2013-01-19 00:44:51)

If you need to convert a nested directory tree into a multidimensional array, use this code:

<?php
$ritit 
= new RecursiveIteratorIterator(new RecursiveDirectoryIterator($startpath), RecursiveIteratorIterator::CHILD_FIRST);
$r = array();
foreach (
$ritit as $splFileInfo) {
   
$path $splFileInfo->isDir()
         ? array(
$splFileInfo->getFilename() => array())
         : array(
$splFileInfo->getFilename());

   for (
$depth $ritit->getDepth() - 1$depth >= 0$depth--) {
       
$path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path);
   }
   
$r array_merge_recursive($r$path);
}

print_r($r);
?>

Josh Heidenreich (2012-02-14 03:51:40)

The returned object is an iterator of SplFileInfo objects.

joelhy (2011-02-22 19:39:51)

Here is how to empty a directory using iterator: 
<?php
function empty_dir($dir) {
    
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir),
                                              
RecursiveIteratorIterator::CHILD_FIRST);
    foreach (
$iterator as $path) {
      if (
$path->isDir()) {
         
rmdir($path->__toString());
      } else {
         
unlink($path->__toString());
      }
    }
//    rmdir($dir);
}
?>

antennen (2011-01-02 09:40:22)

If you use RecursiveDirectoryIterator with RecursiveIteratorIterator and run into UnexpectedValueException you may use this little hack to ignore those directories, such as lost+found on linux.

<?php
class IgnorantRecursiveDirectoryIterator extends RecursiveDirectoryIterator {
    function 
getChildren() {
        try {
            return new 
IgnorantRecursiveDirectoryIterator($this->getPathname());
        } catch(
UnexpectedValueException $e) {
            return new 
RecursiveArrayIterator(array());
        }
    }
}
?>

Use just like the normal RecursiveDirectoryIterator.

Thriault (2010-04-09 00:05:52)

If you would like to get, say, all the *.php files in your project folder, recursively, you could use the following:

<?php

$Directory 
= new RecursiveDirectoryIterator('path/to/project/');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator'/^.+\.php$/i'RecursiveRegexIterator::GET_MATCH);

?>

$Regex will contain a single index array for each PHP file.

megar (2009-07-15 01:57:07)

Usage example:
To see all the files, and count the space usage:

<?php
$ite
=new RecursiveDirectoryIterator("/path/");

$bytestotal=0;
$nbfiles=0;
foreach (new 
RecursiveIteratorIterator($ite) as $filename=>$cur) {
    
$filesize=$cur->getSize();
    
$bytestotal+=$filesize;
    
$nbfiles++;
    echo 
"$filename => $filesize\n";
}

$bytestotal=number_format($bytestotal);
echo 
"Total: $nbfiles files, $bytestotal bytes\n";
?>

Justin Deltener (2009-06-10 09:45:03)

If you don't get a fully recursive listing, remember to check your permissions on the folders. I just spent 2 hours to find out my root folder didn't have +x on it. I did a chmod g+x and now get a full listing. Oddly, I was able to get a listing of files/folders one level UNDER that folder, but nothing beyond that point which was cause for the confusion.

alvaro at demogracia dot com (2008-09-18 08:15:45)

Usage example:

<?php

$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.

易百教程