in fondo al codice c'è un'esempietto 
codice:
<?php
functionEnumerateDirectories($startPath,$dirsSearchPattern='',$filesSearchPattern='')
{
//Inizializzaalcunevariabili
$pathsToEnumerate=array();
$returnValue=array();
//Aggiungeilprimoelementoall'array
$pathsToEnumerate[]=array
(
$startPath,
&$returnValue
);
//Ciclal'elencodelledirectorydaenumerare
while(($pathToEnumerateElement=array_shift($pathsToEnumerate))!==NULL)
{
//Acquisisceilcontenutodelladirectory
$pathToEnumerateDirectories=glob($pathToEnumerateElement[0].'/*');
//Ciclaivarielementiestratti
while(list(,$currentPath)=each($pathToEnumerateDirectories))
{
//Verificaselapathcorrenteèunfileounadirectory
if(is_dir($currentPath)===true)
{
//Verificasesonoattiviicriteridiselezione
if($dirsSearchPattern!=='')
{
if(preg_match($currentPath,$dirsSearchPattern)===false)
{
continue;
}
}
//Svuotalacache
clearstatcache();
//Aggiungeladirectoryall'elenco
$pathToEnumerateElement[1][]=array
(
'TYPE'=>'DIR',
'NAME'=>basename($currentPath),
'STATS'=>stat($currentPath),
'CONTENT'=>array()
);
//Aggiungeladirectoryall'elencodiquelledaciclare
$pathsToEnumerate[]=array
(
$currentPath,
&$pathToEnumerateElement[1][count($pathToEnumerateElement[1])-1]['CONTENT']
);
}
else
{
//Verificasesonoattiviicriteridiselezione
if($filesSearchPattern!=='')
{
if(preg_match($currentPath,$filesSearchPattern)===false)
{
continue;
}
}
//Svuotalacache
clearstatcache();
//Aggiungeladirectoryall'elenco
$pathToEnumerateElement[1][]=array
(
'TYPE'=>'FILE',
'NAME'=>basename($currentPath),
'STATS'=>stat($currentPath)
);
}
}
}
return$returnValue;
}
echo"<pre>";
print_r(EnumerateDirectories('c:/web/Apache2/'));
?>
come vedi il codice è piccolo, commentato, semplice, ti tira fuori un sacco di info e soprattutto non usa la ricorsività 
ergo se lo lanci su c:\ non ti collassa php, al max ci sta un po
(se nn ti servono le statistiche recuperi non poco tempo ^^)