downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

DirectoryIterator::__construct> <CallbackFilterIterator::__construct
[edit] Last updated: Fri, 14 Jun 2013

view this page in

La classe DirectoryIterator

(PHP 5)

Introduction

La classe DirectoryIterator fournit une interface simple pour lire le contenu d'un système de fichiers.

Synopsis de la classe

DirectoryIterator extends SplFileInfo implements SeekableIterator {
/* Méthodes */
public __construct ( string $path )
public DirectoryIterator current ( void )
public int getATime ( void )
public string getBasename ([ string $suffix ] )
public int getCTime ( void )
public string getExtension ( void )
public string getFilename ( void )
public int getGroup ( void )
public int getInode ( void )
public int getMTime ( void )
public int getOwner ( void )
public string getPath ( void )
public string getPathname ( void )
public int getPerms ( void )
public int getSize ( void )
public string getType ( void )
public bool isDir ( void )
public bool isDot ( void )
public bool isExecutable ( void )
public bool isFile ( void )
public bool isLink ( void )
public bool isReadable ( void )
public bool isWritable ( void )
publicstring key ( void )
publicvoid next ( void )
public void rewind ( void )
public void seek ( int $position )
public string __toString ( void )
public bool valid ( void )
}

Historique

Version Description
5.1.2 DirectoryIterator étend SplFileInfo.

Sommaire



add a note add a note User Contributed Notes DirectoryIterator - [6 notes]
up
0
krystianmularczyk at gmail dot com
4 years ago
Shows us all files and catalogues in directory except "." and "..".

<?php

foreach (new DirectoryIterator('../moodle') as $fileInfo) {
    if(
$fileInfo->isDot()) continue;
    echo
$fileInfo->getFilename() . "<br>\n";
}

?>
up
0
rogier at dsone dot nl
10 months ago
Beware of the behavior when using FilesystemIterator::UNIX_PATHS, it's not applied as you might expect.

I guess this flag is added especially for use on windows.
However, the path you construct the RecursiveDirectoryIterator or FilesystemIterator with will not be available as a unix path.
I can't say this is a bug, since most methods are just purely inherited from DirectoryIterator.

In my test, I'd expected a complete unix path. Unfortunately... not quite as expected:

<?php
        
// say $folder = C:\projects\lang

       
$flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS;
       
$d_iterator = new RecursiveDirectoryIterator($folder, $flags);

        echo
$d_iterator->getPath();

?>

expected result: /projects/lang (or C:/projects/lang)
actual result: C:\projects\lang
up
0
Kunal Bhatia->kmasterzone@gmail dot com
2 years ago
Deleting all files in a directory except the one which is last modified.
<?php
    $directory
= dirname(__FILE__)."/demo";
   
$filenames = array();
   
$iterator = new DirectoryIterator($directory);
    foreach (
$iterator as $fileinfo) {
        if (
$fileinfo->isFile()) {
           
$filenames[$fileinfo->getMTime()] = $fileinfo->getFilename();
        }
    }
   
ksort($filenames);
   
print_r($filenames);
    echo
"\n";
   
$i=0;
    if(
sizeof($filenames)>1){
        foreach (
$filenames as $file){
            if(
$i>0){
                echo
$file."\n";
               
unlink($directory."/".$file);
            }
           
$i++;
        }
    }
?>
up
0
red_indian hotmail com
3 years ago
Note that seek() and count() are not always available. At least not on ZendServer CE with PHP 5.2.12 on Mac OSX.

Simple test:

<?php

echo "php ".phpversion().": ";
$dirit = new DirectoryIterator( '.' );
var_dump( method_exists( $dirit, 'seek' ) );
var_dump( method_exists( $dirit, 'count' ) );

?>

You can implement them using existing methods:

seek(): rewind() and then $pos times next()
count(): clone iterator (to keep position), rewind() and then ++$count while ( valid() )
up
0
David Lanstein
4 years ago
DirectoryIterator::getBasename() has been also been available since 5.2.2, according to the changelog (not documented yet).  It takes a parameter $suffix, and is useful if, for instance, you use a naming convention for your files (e.g. ClassName.php). 

The following code uses this to add recursively All*Tests.php in any subdirectory off of tests/, basically, suites of suites.

<?php
// PHPUnit boilerplate code goes here

class AllTests {
    public static function
main() {
       
$parameters = array('verbose' => true);
       
PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
    }

    public static function
suite() {
       
$suite = new PHPUnit_Framework_TestSuite('AllMyTests'); // this must be something different than the class name, per PHPUnit
       
$it = new AllTestsFilterIterator(
                  new
RecursiveIteratorIterator(
                      new
RecursiveDirectoryIterator(dirname(__FILE__) . '/tests')));

        for (
$it->rewind(); $it->valid(); $it->next()) {
            require_once(
$it->current());
           
$className = $it->current()->getBasename('.php');
           
$suite->addTest($className::suite());
        }

        return
$suite;
    }
}
?>

Also, the AllTestsFilterIterator above extends FilterIterator, and contains one method, accept():

<?php
class AllTestsFilterIterator extends FilterIterator {
    public function
accept() {
        if (
preg_match('/All.*Tests\.php/', $this->current())) {
            return
true;
        } else {
            return
false;
        }
    }
}
?>
up
0
Mark van Straten
4 years ago
Implements Iterator so you can foreach() over the content of the given directory

 
show source | credits | sitemap | contact | advertising | mirror sites