PHP

Como Usar Manipulação de Arquivos e Diretórios em PHP em Produção

9 min de leitura

Como Usar Manipulação de Arquivos e Diretórios em PHP em Produção

Entendendo o Sistema de Arquivos em PHP A manipulação de arquivos e diretórios é uma competência fundamental para qualquer desenvolvedor PHP. Seja lendo configurações, armazenando dados do usuário ou gerenciando uploads, você trabalhará constantemente com o sistema de arquivos. PHP oferece funções nativas poderosas que abstraem as complexidades do sistema operacional subjacente. Antes de começar, compreenda que PHP trabalha com caminhos absolutos e relativos. Um caminho absoluto começa da raiz do sistema ( ), enquanto relativo é baseado no diretório atual do script. Use e (constantes mágicas do PHP) para trabalhar com caminhos de forma robusta e independente do sistema operacional. Operações Básicas com Arquivos Criando e Escrevendo em Arquivos A função é sua aliada principal para criar ou sobrescrever arquivos. Ela é simples, segura e retorna o número de bytes escritos ou em caso de erro: Para adicionar conteúdo sem sobrescrever (append), use a flag : Lendo Arquivos Para ler um arquivo inteiro, é o caminho mais direto: Se

<h2>Entendendo o Sistema de Arquivos em PHP</h2>

<p>A manipulação de arquivos e diretórios é uma competência fundamental para qualquer desenvolvedor PHP. Seja lendo configurações, armazenando dados do usuário ou gerenciando uploads, você trabalhará constantemente com o sistema de arquivos. PHP oferece funções nativas poderosas que abstraem as complexidades do sistema operacional subjacente.</p>

<p>Antes de começar, compreenda que PHP trabalha com caminhos absolutos e relativos. Um caminho absoluto começa da raiz do sistema (<code>/var/www/html/arquivo.txt</code>), enquanto relativo é baseado no diretório atual do script. Use <code>__DIR__</code> e <code>__FILE__</code> (constantes mágicas do PHP) para trabalhar com caminhos de forma robusta e independente do sistema operacional.</p>

<h2>Operações Básicas com Arquivos</h2>

<h3>Criando e Escrevendo em Arquivos</h3>

<p>A função <code>file_put_contents()</code> é sua aliada principal para criar ou sobrescrever arquivos. Ela é simples, segura e retorna o número de bytes escritos ou <code>false</code> em caso de erro:</p>

<pre><code class="language-php">&lt;?php

$caminho = __DIR__ . &#039;/dados.txt&#039;;

$conteudo = &quot;Olá, mundo!\nEste é meu primeiro arquivo.&quot;;

if (file_put_contents($caminho, $conteudo)) {

echo &quot;Arquivo criado com sucesso!&quot;;

} else {

echo &quot;Erro ao criar arquivo!&quot;;

}

?&gt;</code></pre>

<p>Para <strong>adicionar conteúdo</strong> sem sobrescrever (append), use a flag <code>FILE_APPEND</code>:</p>

<pre><code class="language-php">&lt;?php

$caminho = __DIR__ . &#039;/log.txt&#039;;

$mensagem = date(&#039;Y-m-d H:i:s&#039;) . &quot; - Nova entrada no log\n&quot;;

file_put_contents($caminho, $mensagem, FILE_APPEND);

?&gt;</code></pre>

<h3>Lendo Arquivos</h3>

<p>Para ler um arquivo inteiro, <code>file_get_contents()</code> é o caminho mais direto:</p>

<pre><code class="language-php">&lt;?php

$caminho = __DIR__ . &#039;/dados.txt&#039;;

if (file_exists($caminho)) {

$conteudo = file_get_contents($caminho);

echo $conteudo;

} else {

echo &quot;Arquivo não encontrado!&quot;;

}

?&gt;</code></pre>

<p>Se você precisa processar o arquivo linha por linha (útil para arquivos grandes), use <code>fopen()</code> com <code>fgets()</code>:</p>

<pre><code class="language-php">&lt;?php

$caminho = __DIR__ . &#039;/grande_arquivo.txt&#039;;

$arquivo = fopen($caminho, &#039;r&#039;);

if ($arquivo) {

while (($linha = fgets($arquivo)) !== false) {

echo trim($linha) . &quot;\n&quot;;

}

fclose($arquivo);

}

?&gt;</code></pre>

<h2>Manipulação de Diretórios</h2>

<h3>Criando e Navegando em Diretórios</h3>

<p>Para criar um diretório, use <code>mkdir()</code>. O terceiro parâmetro permite criar diretórios aninhados recursivamente:</p>

<pre><code class="language-php">&lt;?php

$diretorio = __DIR__ . &#039;/uploads/2024/janeiro&#039;;

if (!is_dir($diretorio)) {

if (mkdir($diretorio, 0755, true)) {

echo &quot;Diretório criado!&quot;;

}

}

?&gt;</code></pre>

<p>Para <strong>listar arquivos</strong> em um diretório, <code>scandir()</code> retorna um array com todos os itens:</p>

<pre><code class="language-php">&lt;?php

$diretorio = __DIR__ . &#039;/uploads&#039;;

if (is_dir($diretorio)) {

$arquivos = scandir($diretorio);

foreach ($arquivos as $arquivo) {

if ($arquivo !== &#039;.&#039; &amp;&amp; $arquivo !== &#039;..&#039;) {

$caminho_completo = $diretorio . &#039;/&#039; . $arquivo;

$tipo = is_file($caminho_completo) ? &#039;Arquivo&#039; : &#039;Diretório&#039;;

echo &quot;$arquivo ($tipo)\n&quot;;

}

}

}

?&gt;</code></pre>

<h3>Deletando e Movendo</h3>

<p>Para remover um arquivo, <code>unlink()</code> é suficiente:</p>

<pre><code class="language-php">&lt;?php

$arquivo = __DIR__ . &#039;/temp.txt&#039;;

if (file_exists($arquivo) &amp;&amp; is_file($arquivo)) {

if (unlink($arquivo)) {

echo &quot;Arquivo deletado!&quot;;

}

}

?&gt;</code></pre>

<p>Para remover um diretório vazio, use <code>rmdir()</code>. Se contém arquivos, você precisa deletá-los primeiro ou usar uma solução recursiva:</p>

<pre><code class="language-php">&lt;?php

function deletar_diretorio_recursivo($diretorio) {

if (!is_dir($diretorio)) return false;

$arquivos = scandir($diretorio);

foreach ($arquivos as $arquivo) {

if ($arquivo !== &#039;.&#039; &amp;&amp; $arquivo !== &#039;..&#039;) {

$caminho = $diretorio . &#039;/&#039; . $arquivo;

is_dir($caminho) ? deletar_diretorio_recursivo($caminho) : unlink($caminho);

}

}

return rmdir($diretorio);

}

deletar_diretorio_recursivo(__DIR__ . &#039;/pasta_temp&#039;);

?&gt;</code></pre>

<p>Para <strong>mover ou renomear</strong>, <code>rename()</code> funciona para arquivos e diretórios:</p>

<pre><code class="language-php">&lt;?php

$origem = __DIR__ . &#039;/arquivo_antigo.txt&#039;;

$destino = __DIR__ . &#039;/arquivo_novo.txt&#039;;

if (rename($origem, $destino)) {

echo &quot;Arquivo movido com sucesso!&quot;;

}

?&gt;</code></pre>

<h2>Informações e Validações</h2>

<h3>Verificando Propriedades</h3>

<p>Antes de manipular arquivos, sempre valide sua existência e tipo. PHP oferece funções específicas e eficientes:</p>

<pre><code class="language-php">&lt;?php

$caminho = __DIR__ . &#039;/dados.txt&#039;;

echo &quot;Existe? &quot; . (file_exists($caminho) ? &#039;Sim&#039; : &#039;Não&#039;) . &quot;\n&quot;;

echo &quot;É arquivo? &quot; . (is_file($caminho) ? &#039;Sim&#039; : &#039;Não&#039;) . &quot;\n&quot;;

echo &quot;É diretório? &quot; . (is_dir($caminho) ? &#039;Sim&#039; : &#039;Não&#039;) . &quot;\n&quot;;

echo &quot;Legível? &quot; . (is_readable($caminho) ? &#039;Sim&#039; : &#039;Não&#039;) . &quot;\n&quot;;

echo &quot;Gravável? &quot; . (is_writable($caminho) ? &#039;Sim&#039; : &#039;Não&#039;) . &quot;\n&quot;;

echo &quot;Tamanho: &quot; . filesize($caminho) . &quot; bytes\n&quot;;

echo &quot;Última modificação: &quot; . date(&#039;d/m/Y H:i:s&#039;, filemtime($caminho)) . &quot;\n&quot;;

?&gt;</code></pre>

<h3>Exemplo Prático: Upload Seguro</h3>

<p>Combine validações para criar um sistema de upload robusto:</p>

<pre><code class="language-php">&lt;?php

if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039; &amp;&amp; isset($_FILES[&#039;arquivo&#039;])) {

$arquivo = $_FILES[&#039;arquivo&#039;];

$extensoes_permitidas = [&#039;jpg&#039;, &#039;png&#039;, &#039;pdf&#039;];

$tamanho_maximo = 5 1024 1024; // 5MB

$extensao = strtolower(pathinfo($arquivo[&#039;name&#039;], PATHINFO_EXTENSION));

if ($arquivo[&#039;size&#039;] &gt; $tamanho_maximo) {

echo &quot;Arquivo muito grande!&quot;;

} elseif (!in_array($extensao, $extensoes_permitidas)) {

echo &quot;Extensão não permitida!&quot;;

} elseif ($arquivo[&#039;error&#039;] !== UPLOAD_ERR_OK) {

echo &quot;Erro no upload!&quot;;

} else {

$destino = __DIR__ . &#039;/uploads/&#039; . uniqid() . &#039;.&#039; . $extensao;

if (move_uploaded_file($arquivo[&#039;tmp_name&#039;], $destino)) {

echo &quot;Upload realizado com sucesso!&quot;;

}

}

}

?&gt;</code></pre>

<h2>Conclusão</h2>

<p>Dominar manipulação de arquivos em PHP é essencial para qualquer desenvolvedor. Os três pontos principais que você deve internalizar:</p>

<ol>

<li><strong>Use as funções nativas apropriadas</strong>: <code>file_put_contents()</code> e <code>file_get_contents()</code> para operações simples, <code>fopen()</code> para arquivos grandes, e sempre valide com <code>file_exists()</code>, <code>is_file()</code> e <code>is_writable()</code>.</li>

</ol>

<ol>

<li><strong>Segurança em primeiro lugar</strong>: Sempre valide entradas, use caminhos absolutos com <code>__DIR__</code>, implemente restrições de tamanho e tipo, e sanitize nomes de arquivo antes de armazenar.</li>

</ol>

<ol>

<li><strong>Estruture seus diretórios logicamente</strong>: Crie estruturas organizadas com <code>mkdir()</code> recursivo, separe uploads temporários de permanentes, e implemente limpeza de arquivos antigos regularmente.</li>

</ol>

<p>A prática é crucial — comece criando scripts simples que leiam, criem e deletem arquivos antes de avançar para sistemas complexos como gerenciadores de mídia.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://www.php.net/manual/en/ref.filesystem.php" target="_blank" rel="noopener noreferrer">PHP: Filesystem Functions</a></li>

<li><a href="https://www.php.net/manual/en/function.file-put-contents.php" target="_blank" rel="noopener noreferrer">PHP: file_put_contents</a></li>

<li><a href="https://www.php.net/manual/en/features.file-upload.php" target="_blank" rel="noopener noreferrer">PHP: Handling File Uploads</a></li>

<li><a href="https://www.php-fig.org/psr/psr-4/" target="_blank" rel="noopener noreferrer">PSR-4: Autoloading Standard</a></li>

<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html" target="_blank" rel="noopener noreferrer">OWASP: File Upload Cheat Sheet</a></li>

</ul>

Comentários

Mais em PHP

Laravel Blade: Templates, Componentes e Layouts: Do Básico ao Avançado
Laravel Blade: Templates, Componentes e Layouts: Do Básico ao Avançado

Introdução ao Laravel Blade O Laravel Blade é o motor de templates padrão do...

Construindo uma API REST Completa com Laravel na Prática
Construindo uma API REST Completa com Laravel na Prática

Fundações: Preparando o Ambiente Antes de construir sua API REST em Laravel,...

Laravel Routes, Controllers e Request Validation na Prática
Laravel Routes, Controllers e Request Validation na Prática

Routes: Fundação da Aplicação As rotas definem como sua aplicação responde às...