Don't store DirectoryIterator objects for later; you will get an error saying "too many open files" when you store more than the operating system limit (usually 256 or 1024).
For example, this will yield an error if the directory has too many files:
<?php
$files = array();
foreach (new DirectoryIterator('myDir') as $file) {
$files[] = $file;
}
?>
Presumably, this approach is memory intensive as well.
DirectoryIterator::__construct
(PHP 5)
DirectoryIterator::__construct — Constructs a new directory iterator from a path
Description
DirectoryIterator::__construct
( string $path
)
Constructs a new directory iterator from a path.
Parameters
- path
-
The path of the directory to traverse.
Errors/Exceptions
Throws an UnexpectedValueException if the path cannot be opened.
Examples
Example #1 A DirectoryIterator::__construct example
This example will list the contents of the directory containing the script.
<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
var_dump($fileinfo->getFilename());
}
}
?>
DirectoryIterator::__construct
kendsnyder at gmail dot com
04-Dec-2008 07:54
04-Dec-2008 07:54
pcdinh at phpvietnam dot net
13-Aug-2007 02:55
13-Aug-2007 02:55
I need to traverse recursively through a directory tree and get all sub-directory paths and has written a snippet to do that.
<?php
$path = "D:\webroot\phpvietnamcms";
foreach (new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME), RecursiveIteratorIterator::CHILD_FIRST) as $file => $info) {
if ($info->isDir())
{
echo $file."<br />";
}
}
?>
goran at extensionsforjoomla dot com
20-Jun-2007 11:44
20-Jun-2007 11:44
I needed to match in directory tree file name(s) by regular expression. Code is based on Marcus Börger class DirectoryTreeIterator http://cvs.php.net/viewvc.cgi/php-src/ext/spl/examples/ and on examples given in his lecture Introduction to object oriented PHP at PHP Quebec conference 2007 http://talks.somabo.de/
<?php
class KeyFilter extends FilterIterator
{
private $_rx;
function __construct(Iterator $it, $regex)
{
parent::__construct($it);
$this->_rx= $regex;
}
function accept()
{
return ereg($this->_rx,$this->getInnerIterator()->key());
}
protected function __clone() {
return false;
}
}
class DirMach extends KeyFilter
{
function __construct($path , $regex)
{
parent::__construct(
new DirectoryTreeIterator($path), $regex);
}
function current()
{
return parent::key();
}
function key()
{
return parent::key();
}
}
class DirectoryTreeIterator extends RecursiveIteratorIterator
{
/** Construct from a path.
* @param $path directory to iterate
*/
function __construct($path)
{
try {
parent::__construct(
new RecursiveCachingIterator(
new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_FILENAME
),
CachingIterator::CALL_TOSTRING|CachingIterator::CATCH_GET_CHILD
),
parent::SELF_FIRST
);
} catch(Exception $e) {
echo $e->getMessage();
exit;
}
}
/** @return the current element prefixed with ASCII graphics
*/
function current()
{
if ($this->hasChildren())
$this->next();
return $this->key();
}
/** Aggregates the inner iterator
*/
function __call($func, $params)
{
return call_user_func_array(array($this->getSubIterator(), $func), $params);
}
}
$PathToSearch = 'path_to_search';
$regex = 'regular_expression';
$FileList = new DirMach($PathToSearch, $regex);
foreach ($FileList as $file) {
$match[] = $file;
}
echo '<pre>';
var_dump($match);
echo '</pre>';
?>
pcdinh at phpvietnam dot net
19-Apr-2007 08:58
19-Apr-2007 08:58
The use of this class is rather simple
<?php
$dataDir = dirname(__FILE__).'/world_vest_base/';
try
{
$dir = new DirectoryIterator($dataDir);
foreach ($dir as $file)
{
$fileName = $file->getFilename();
}
}
catch (Exception $ex)
{
}
?>
If $dataDir is null, a Runtime Exception will throws a message like this: Directory name must not be empty.
If $dataDir does not exist, that message will look like this: failed to open dir: No such file or directory.
Please be careful in case you are looking for filenames in that directory because DirectoryIterator will return a very special symbolic filenames: . and .. You must do a check to ignore them before dealing with real file names.
$dir is a DirectoryIterator object
troels
03-Apr-2007 02:34
03-Apr-2007 02:34
The documentation for DirectoryIterator is sparse. I found this nice overview:
http://www.jellyandcustard.com/2006/05/18
/using-directoryiterator-to-list-files-in-php
(The above is one line, but I'm not allowed to post it like that)
springub at northclick dot de
13-Dec-2006 12:26
13-Dec-2006 12:26
udvig dot ericson at gmail dot com
29-Jul-2006 07:48
In response to the comment below from udvig. The Example ist wrong, here is the right one:
<?php
$dir = new DirectoryIterator("/tmp");
foreach ($dir as $file) {
if ($file->isDot()) {
continue;
}
echo $file->getFilename() . "\n";
}
?>
ludvig dot ericson at gmail dot com
29-Jul-2006 05:48
29-Jul-2006 05:48
In response to the comment below, you don't have to simulate a foreach(), DirectoryIterator obviously inherits SPL's Iterator interface, therefore:
<?php
$dir = new DirectoryIterator("/tmp");
foreach ($dir as $file) {
if ($dir->isDot()) {
continue;
}
echo $file . "\n";
}
?>
fernandobassani at gmail dot com
25-Jan-2006 06:36
25-Jan-2006 06:36
We can now replace the old fashioned way of listing the content from a directory!
the old way:
<?php
if ($handle = opendir('/home/fernando/temp')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
print "$file <br />";
}
}
closedir($handle);
}
?>
the new way:
<?php
$dir = new DirectoryIterator('/home/fernando/temp');
while($dir->valid()) {
if(!$dir->isDot()) {
print $dir->current()."<br />";
}
$dir->next();
}
?>
jakob dot buchgraber at gmail dot com
04-Jan-2006 03:36
04-Jan-2006 03:36
I wrote a function for finding all files in the current and in subdirectories.
The Code:
<?php
function getFiles(&$rdi,$depth=0) {
if (!is_object($rdi))
return;
for ($rdi->rewind();$rdi->valid();$rdi->next()) {
if ($rdi->isDot())
continue;
if ($rdi->isDir() || $rdi->isFile()) {
for ($i = 0; $i<=$depth;++$i)
echo ' ';
echo $rdi->current().'<br />';
if ($rdi->hasChildren())
getFiles($rdi->getChildren(),1+$depth);
}
}
}
getFiles(new RecursiveDirectoryIterator('.'));
?>
