Criar diretórios recursivamente em PHP

Gustavo Paes, 16/01/2011

Atualização: O PHP incluiu – faz um bom tempo – um atributo na função mkdir que faz a criação de diretórios de forma recursiva nativamente, poupando um bom trabalho do programador.

bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )

Dessa forma, passando true no terceiro parâmetro do da função, os diretórios serão criados de forma recursiva:

$dir = "/home/conta/public_html/projeto/app/diretorio";

mkdir($dir, 0755, true);

Mais informçãoes sobre o mkdir, acesse: http://php.net/mkdir


O PHP — e outras linguagens — não traz nenhuma função (ao menos não conheço) que crie diretórios recursivamente. Ou seja, não é possível você passar ao comando mkdir o caminho /path/para/um/diretorio/qualquer sem que o caminho /path/para/um/diretorio já não tenha sido criado.

Para isso, você precisa percorrer diretório por diretório e ir criando aqueles que não existem até chegar ao diretório final. Um trabalho chato mas que feito uma vez basta importar para os demais projetos.

Segue o código que acabei de usar:

$dir = "/home/conta/public_html/projeto/app/diretorio";
if(!is_dir($dir)) {
  // array com todos os diretórios
  $paths = split("/", $dir);
  // durante o while vai concatenando todos os diretórios
  $partial_path = "/".$paths[0];

  // qual o indice do diretório atual
  $actual_path  = 0;

  while( $actual_path < count($paths) ) {
    if(!is_dir($partial_path)) mkdir($partial_path);

    $partial_path .=  $paths[++$actual_path] . "/";
  }
}

Só uma ressalva: é importante definir o path completo, como no próprio exemplo. Isso porque eu concateno ao primeiro diretório uma barra.