<?php
// +---------------------------------------+
// |  -> Pode fazer o que quiser com isso  |
// |                                       |
// |  12-02-2004           Silvano (gosh)  |
// +---------------------------------------+
set_time_limit(0);

if (PHP_OS == "WIN32") {
    define(BARRA, "\\");
} else {
    define(BARRA, "/");
}

class ArvoreDiretorios {

    function executa($diretorio)
    {
        $array_dados = ArvoreDiretorios::lerDiretorio($diretorio);
        ArvoreDiretorios::mostraArvore($array_dados, 0);
    }

    /**
     * Esta fun��o l� o diret�rio passado e pega o espa�o total
     * ocupado pelos arquivos e diret�rios, retornando tudo em um
     * array
     *
     * @author Silvano Girardi Jr.  <sgj@dr.com>
     */
    function lerDiretorio($nome)
    {
        $retorno = array();
        
        if (is_dir($nome)) {
            $handle = @opendir($nome);
            if (!$handle) {
                return "N�o foi poss�vel abrir o diret�rio";
            }
            $tamanho = 0;
            while($filename = readdir($handle)) {
                if ($filename != "." && $filename != "..") {
                    $temp = ArvoreDiretorios::lerDiretorio($nome.BARRA.$filename);
                    if (is_array($temp)) {
                        if (!is_array($retorno[$nome])) {
                            $retorno[$nome] = array();
                        }
                        $retorno[$nome] = array_merge($retorno[$nome], $temp);
                    } else {
                        $tamanho += $temp;
                    }
                }
            }
            closedir($handle);
            
            if (!is_array($retorno[$nome])) {
                $retorno[$nome] = array();
            }
            array_push($retorno[$nome], number_format($tamanho, 2, ".", ","));
        
            return $retorno;
        } else {
            return (filesize(getcwd().BARRA.$nome)/1024);
        }
    }
    
    /**
     * Esta fun��o � uma modifica��o da vers�o apresentada nos coment�rios
     * da fun��o dir() no site php.net/dir por 'de\kibo\niels'
     */
    function mostraArvore ($array_dados, $profundidade) {
        foreach ($array_dados AS $nome => $tamanho) {
            if (is_array($tamanho)) {
                for ($i = 0; $i < $profundidade - 1; $i++) {
                    echo "<i>| </i>";
                }
                echo "<i>+-</i>";
                echo "<b>".$nome." (".$array_dados[$nome][0]." Kb)</b>\n";
                $profundidade++;
                ArvoreDiretorios::mostraArvore($tamanho, $profundidade);
                $profundidade--;
            }
        }
    }
}

echo "
<style>
b {font-weight: normal; color:black}
i {font-style:normal; color:red}
</style>
<pre>";

# exemplo: 
ArvoreDiretorios::executa(".");

?>