PHPLegends

PHPLegends é um blog onde você encontrará várias dicas e curiosidades sobre PHP

Code Golf - Criar um diretório caso não exista e outras operações com arquivos

introdução

No PHP, uma vez ou outra, principalmente quando precisamos fazer um upload, sempre precisamos criar uma pasta condicionalmente, caso a mesma não exista.

Geralmente, fazemos um if para saber se o diretório já existe e, em seguida, executamos a função mkdir.

Assim:


$directory = '/var/www/public/img';

if (! is_dir($directory)) {
    mkdir($directory);
}

o truque

Eu, particularmente, não gosto de usar if para casos assim. Isso porque tanto no PHP quanto no Javascript, é possível executar funções condicionalmente, sem precisar de if.

Veja:


$directory = '/var/www/site/public/img';

is_dir($directory) || mkdir($directory);

O código acima faz o seguinte processamento se is_directory($directory) for true, não faça nada. Se for false, execute mkdir($directory).

Isso acontece porque o PHP vai avaliando cada expressão, começando da esquerda para direita. O operador || vai executar cada expressão enquanto nenhuma delas for avaliada como verdadeira!

Há um truque para fazer isso com o operador &&, porém, se fôssemos aplicar ao caso da verificação se o diretório existe para então criá-lo, seria necessário mudar a expressão, colocando uma negação no início.

!is_dir($directory) && mkdir($directory)

exemplos mais avançados

Há muitos casos que já vi em códigos PHP onde o programador se preocupou em separar nome do arquivo e nome do diretório separadamente, justamente para criar o diretório caso não exista.

Houve casos onde eu tinha o nome do arquivo de destino para um upload “montado” e não havia separação entre “diretório” e “nome do arquivo”.

Nesses casos, se for necessário saber se a pasta existe antes de mover o arquivo para aquele destino, basta apenas usar uma função do php que extrai o nome da pasta baseada no caminho completo do arquivo: dirname.

Assim:


$directory =  dirname($midia->file_path);

is_dir($directory) || mkdir($directory, 0775, true);

move_uploaded_file($_FILES['file'], $midia->file_path);

Com o código acima, não há necessidade de separar concatenar os valores para depois montar o nome do arquivo.