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.