Complete recursive directory listing

Description: This snippet will take a given path and list every file/directory under that path. Uses recursion and lists files/dirs in depth level.

<?php
/*
Complete Directory Listing (recursive)
by Dominique Stender (saloon12yrd@yahoo.com)
based on a script by James Holden (jholden@webcoding.co.uk)
Version 0.2
array RecurseDir( string directory );
-- Description -----------------------------------------------------------------
This script recurses a directory on the server and puts its content
in an array. Each subdirectory is put into a subarray.
The array for each single directory has the following structure:
$thisdir = array("name" => "absolute path of the direcory",
"struct" => array());
As you can see the path itself is put into the "name" field of the
array while the "struct" field is an array.
For each file the function finds it adds an entry to the next
"struct" field containing the files' name.
For each directory the function finds it adds an entry to the next
"struct" field containing a new array of the described structure.
There are two exceptions:
unaccessible directories have a scalar struct = -1
empty directories have a scalar struct = -2
After the function has recursed the whole directory it returns the array
-- Example ---------------------------------------------------------------------
When I recurse a part of my apache htdocs directorytree which contains
some images the array looks like this (PHP comments not included).
Each subarray and therefore each subdirectory is indicated by leading
whitespace:
name = /usr/local/apache/htdocs/media // this is where we start
struct
name = /usr/local/apache/htdocs/media/.1 // first entry is a dir
struct
name = /usr/local/apache/htdocs/media/.1/.3 // same here, dir again
struct // this dir has content
0 = 40.jpg // 0 is the arrays key
1 = tn_40.jpg // the *.jpg's are the value
2 = 41.jpg
3 = tn_41.jpg
4 = 42.jpg
5 = tn_42.jpg
6 = 43.jpg
7 = tn_43.jpg
8 = 44.jpg
9 = tn_44.jpg
10 = 45.jpg
11 = tn_45.jpg
name = /usr/local/apache/htdocs/media/.1/.4 // next subdirectory
struct = -1 // access denied!
name = /usr/local/apache/htdocs/media/.1/.5 // next subdirectory
struct // content again
0 = 81.jpg
1 = tn_81.jpg
2 = 82.jpg
3 = tn_82.jpg
4 = 83.jpg
5 = tn_83.jpg
6 = 84.jpg
7 = tn_84.jpg
8 = 85.jpg
9 = tn_85.jpg
10 = 86.jpg
11 = tn_86.jpg
12 = 87.jpg
13 = tn_87.jpg
14 = 88.jpg
15 = tn_88.jpg
name = /usr/local/apache/htdocs/media/.2 // next subdirectory
struct
name = /usr/local/apache/htdocs/media/.2/.6 // another subdir
struct = -2 // this one is empty!
-- Disclaimer ------------------------------------------------------------------
This script is provided as-is. I take no responsibility on any misbehavior,
errors, damage or whatever else this script might cause.
As the original script by James Holden did not clearly say under which
license it was published I decided to make it freeware. You can use this
script for any purpose you want, non-commercially and commercially alike,
and you're allowed to change the code to whatever pleases you.
You do not need to republish the resulting script as freeware.
If this license offends the intended license by James Holden please let me
know and I will change it as necessary.
*/
function RecurseDir($directory) {
$thisdir = array("name", "struct");
$thisdir['name'] = $directory;
if ($dir = @opendir($directory)) {
$i = 0;
while ($file = readdir($dir)) {
if (($file != ".")&&($file != "..")) {
$tempDir = $directory."/".$file;
if (is_dir($tempDir)) {
$thisdir['struct'][] = RecurseDir($tempDir,$file);
} else {
$thisdir['struct'][] = $file;
}
$i++;
}
}
if ($i == 0) {
// empty directory
$thisdir['struct'] = -2;
}
} else {
// directory could not be accessed
$thisdir['struct'] = -1;
}
return $thisdir;
}
?>

Please enable Javascript in your browser, before you post the comment! Now Javascript is disabled.