/**
 * Cria um diretorio recursivamente
 * String $diretorio: nome do diretorio a ser criado
 * Int $permissao: permissao a ser definida (notacao em octal)
 */
function criar_diretorio_recursivo($diretorio, $permissao = 0700) {
    if (file_exists($diretorio)) {
        return true;
    }

    // Buscar ate' que ponto do caminho ja' existe diretorio criado
    $vt_nome = explode(DIRECTORY_SEPARATOR, $diretorio);
    $buf = array_shift($vt_nome).DIRECTORY_SEPARATOR;
    $count = count($vt_nome);
    for ($i = 0; $i < $count; $i++) {
        if ($vt_nome[$i] === '') {
            continue;
        }
        $nome_parcial = $buf.DIRECTORY_SEPARATOR.$vt_nome[$i];
        if (!file_exists($nome_parcial)) {
            break;

        // Se o caminho existe, mas nao e' diretorio ou nao pode entrar nele
        } elseif (!is_executable($nome_parcial) || !is_dir($nome_parcial)) {
            trigger_error("Nao foi possivel acessar {$nome_parcial}", E_USER_WARNING);
            return false;
        }
        $buf .= DIRECTORY_SEPARATOR.$vt_nome[$i];
    }

    // Criar os diretorios que estao faltando
    $vt_diretorios = array();
    $buf2 = $buf;
    for ($j = $i; $j < $count; $j++) {
        if ($vt_nome[$j] === '') {
            continue;
        }
        $novo_dir = $buf2.DIRECTORY_SEPARATOR.$vt_nome[$j];
        if (mkdir($novo_dir)) {
            
            // Inserir no vetor de diretorios criados
            array_unshift($vt_diretorios, $novo_dir);
            
            // Colocar permissao de escrita e execucao provisoriamente
            chmod($novo_dir, 0300);
        } else {
            trigger_error('Erro desconhecido ao criar diretorio '.$novo_dir, E_USER_WARNING);
            return false;
        }
        $buf2 = $novo_dir;
    }

    // Colocar a permissao desejada nos diretorios criados
    foreach ($vt_diretorios as $dir) {
        chmod($dir, $permissao);
    }

    return true;
}