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 />";
}
}
?>
DirectoryIterator::__construct
(PHP 5)
DirectoryIterator::__construct — Constructs a new dir iterator from a path
Description
DirectoryIterator::__construct
( string $path
)
Warning
This function is currently not documented; only its argument list is available.
Constructs a new dir iterator from a path.
Parameters
- path
-
The path.
Return Values
No value is returned.
DirectoryIterator::__construct
pcdinh at phpvietnam dot net
12-Aug-2007 10:55
12-Aug-2007 10:55
goran at extensionsforjoomla dot com
20-Jun-2007 07:44
20-Jun-2007 07: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 04:58
19-Apr-2007 04: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 10:34
03-Apr-2007 10: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 07:26
13-Dec-2006 07: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 01:48
29-Jul-2006 01: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 01:36
25-Jan-2006 01: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 10:36
04-Jan-2006 10: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('.'));
?>
