Manipulando arquivos com PHP

Na medida do possível (o tempo está curto) pretendo disponibilizar algumas dicas de PHP. Para começar, vamos falar sobre a manipulação de arquivos usando as funções nativas do PHP.

Mas para que eu iria querer manipular meus arquivos via PHP? – Nós podemos usar a manipulação de arquivos para várias coisas como: Fazer um gerenciador de arquivos remoto, editar um arquivo .css remotamente em um sistema gerenciador de conteúdo qualquer, salvar informações de acesso em um arquivo de log, criar um contador para seu site e até mesmo substituir um programa SGBD em tarefas corriqueiras em que sejam manipulados dados simples, etc. Recentemente utilizei bastante essas funções na construção do framework PHP Coupé. Então vamos lá:

As funções que utilizaremos em todo tutorial são:

  • fopen() – ‘Abre’ o arquivo para que possa ser manipulado.
  • fgets() – Pega uma linha do arquivo até o máximo de 1024bytes.
  • feof() – Durante a leitura de um arquivo, avisa se chegou ao final.
  • file_get_contents() – Pega todo conteúdo do arquivo aberto como uma string.
  • ftruncate() – Reduz o tamanho do arquivo. Usado para apagar seu conteúdo.
  • fwrite() – Escreve no arquivo.
  • unlink() – Apaga o arquivo indicado.

1 – Criando os arquivos

Para começar, vamos primeiro criar o nosso arquivo. Para isso existe a função fopen().
Com esta função podemos criar qualquer arquivo novo. Sua sintaxe é a seguinte:

fopen ($nomedoarquivo, $modo);

Como podemos ver, a função fopen possui dois argumentos: O nome do arquivo e o modo que esse arquivo será criado.

  • $nomedoarquivo – O nome do arquivo pode conter o caminho absoluto onde você deseja criar o seu arquivo. Exemplo, ‘www/programa/arquivo.txt’.
  • $modo – O modo indica as permissões de acesso para o arquivo que foi criado. Por exemplo, ele pode ser criado apenas para leitura (consulta de dados) ou para escrita e leitura.

Segue abaixo a tabela com os modos de arquivos retirados da documentação oficial do PHP.

Modo Descrição
‘w’ Abre o arquivo para apenas escrita; coloca o ponteiro do arquivo no começo do arquivo e diminui (trunca) o tamanho do arquivo para zero. Se o arquivo não existe, tenta criá-lo.
‘w+’ Abre o arquivo para leitura e escrita; coloca o ponteiro do arquivo no começo e diminui (trunca) o tamanho do arquivo para zero. Se o arquivo não existe, tenta criá-lo.
‘r’ Abre o arquivo somente para leitura; coloca o ponteiro de escrita no começo do arquivo. [Retorna um erro caso o arquivo não exista e não tenta cria-lo.]
‘r+’ Abre para leitura e escrita; coloca o ponteiro de escrita no começo do arquivo. [Retorna um erro caso o arquivo não exista e não tenta cria-lo.]
‘a’ Abre para somente para escrita somente; coloca o ponteiro do arquivo no final. Se o arquivo não existir, tenta criá-lo.
‘a+’ Abre o arquivo para leitura e escrita; coloca o ponteiro do arquivo no final. Se o arquivo não existir, tenta criá-lo.
‘x’ Cria e abre o arquivo para escrita somente; coloca o ponteiro no início do arquivo. Se o arquivo já existe, a chamada a fopen() irá falhar, retornando FALSE, gerando um erro nível E_WARNING. Se o arquivo não existe, tenta criá-lo. Esta opção é suportada no PHP 4.3.2 e posteriores, e somente funciona em arquivos locais.
‘x+’ Cria e abre um arquivo para escrita e leitura; coloca o ponteiro do arquivo no início. Se o arquivo já existe, a chamada a fopen() irá falhar, retornando FALSE, gerando um erro nível E_WARNING. Se o arquivo não existe, tenta criá-lo. Esta opção é suportada no PHP 4.3.2 e posteriores, e somente funciona em arquivos locais.

Vamos a alguns exemplos práticos:

Exemplo- criar um novo arquivo para escrita

<?php
$arquivo = fopen('meuarquivo.txt','w');
if ($arquivo == false) die('Não foi possível criar o arquivo.');
?>

O código acima cria um novo arquivo (para escrita somente) no diretório corrente do arquivo PHP executado.
Tenha cuidado pois o modo ‘w’ coloca o ponteiro de escrita no início do arquivo. Se o arquivo já existir, ele deletará todo o conteúdo.
Se a função funcionar ele retorna o ponteiro do arquivo. Mas se a função falhar por qualquer motivo, a função retorna false.

Exemplo – criar um novo arquivo para leitura e escrita

<?php
$arquivo = fopen('meuarquivo.txt','w+');
if ($arquivo == false) die('Não foi possível criar o arquivo.');
?>

Como no exemplo 1, o código acima cria um novo tanto para leitura como para escrita no diretório corrente do arquivo PHP executado.
O modo ‘w+’ coloca o ponteiro no início do arquivo. Se o arquivo já existir, ele deletará todo o conteúdo.

Exemplo – abrir um arquivo para leitura com o modo ‘r’

‘E se eu não quiser deletar o conteúdo e só acrescentar mais informações quando o arquivo já existir???’

<?php
$arquivo = fopen('meuarquivo.txt','r');
if ($arquivo == false) die('O arquivo não existe.');
?>

O modo ‘r’ abre o arquivo. Ele coloca o ponteiro no início do arquivo e lê todo seu conteúdo até o final. Use o modo ‘r+’ para ativar também a escrita junto com a leitura. Como o ponteiro é posicionado no início do arquivo, o novo conteúdo ficará no início e não no final. Caso o arquivo não exista, ele retorna um erro e não tenta cria o arquivo. Caso você queira criar o arquivo caso ele não exista, você pode usar o modo ‘a’.

Exemplo – O modo ‘a’

‘E se eu quiser posicionar o ponteiro no final do arquivo???’

<?php
$arquivo = fopen('meuarquivo.txt','a');
if ($arquivo == false) die('Não foi possível criar o arquivo.');
?>

Da mesma forma que o modo ‘w’, você pode usar o modo ‘a’ ou ‘a+’ para criar o seu novo arquivo com as permissões de leitura/escrita respectivamente. Se o arquivo já existir, ele não irá truncar o arquivo (não deleta nenhum conteúdo) e irá colocar o ponteiro no final para que a leitura/escrita continue a partir daí.

2 – Lendo arquivos

Agora que já aprendemos a criar e abrir nossos arquivos, vamos ver como se faz para lê-los. Para isso temos a função fgets(). A função fgets() é usada para ler um arquivo linha por linha. Ela aceita dois tipos de parâmetros, veja:

fgets($ponteiro, $tamanho);

Os argumentos são o ponteiro e o tamanho em bytes.

  • $ponteiro – O ponteiro aqui utilizado, está armazenado na variável que você usou para abrir ou criar o arquivo.
  • $tamanho – Como já foi dito, é o tamanho em número de bytes que deve ser lida a linha do arquivo. Se não for especificado, o programa irá ler até o final da linha (até um número máximo de 1024 caracteres).

Exemplo – lendo a primeira linha

<?php
$arquivo = fopen('meuarquivo.txt','r');
if ($arquivo == false) die('Não foi possível abrir o arquivo.');
$linha = fgets($arquivo);
echo $linha;
fclose($arquivo);
?>

No código acima abrimos um arquivo com o modo ‘r’ que posiciona o ponteiro no início do arquivo. Depois efetuamos o comando fgets() sem o parâmetro de tamanho. Isso quer dizer que toda primeira linha do arquivo está sendo lida.

Observe também que utilizamos a função fclose() para fechar o arquivo que está aberto. Procure imaginar como se, em seu desktop, você tivesse aberto um arquivo, alterado-o e depois fechado. O processo é o mesmo, e temos funções específicas para cada uma dessas ações (abrir, alterar e fechar).

Exemplo – lendo um determinado número de bytes

<?php
$arquivo = fopen('meuarquivo.txt','r');
if ($arquivo == false) die('Não foi possível abrir o arquivo.');
$linha = fgets($arquivo, 64);
echo $linha;
fclose($arquivo);
?>

Agora nosso programa irá imprimir os primeiro 64 palavras da primeira linha do ‘meuarquivo.txt’.

Exemplo – retornando o arquivo inteiro linha por linha

No código abaixo usaremos um loop continuo (eterno) pegando linha por linha do arquivo. Quando é verificado que a variável linha retornou vazia, ele da um break que para a repetição e fecha o arquivo. Fica a pergunta: ‘E se meu arquivo tiver uma linha vazia?’. Não existe linha vazia entre o início e o final de um documento. Mesmo que determinada linha não tenha nada escrito, ela contém um marcador que indica a quebra de linha.

<?php
$arquivo = fopen('meuarquivo.txt','r');
if ($arquivo == false) die('Não foi possível abrir o arquivo.');
while(true) {
	$linha = fgets($arquivo);
	if ($linha==null) break;
	echo $linha;
}
fclose($arquivo);
?>

Outra forma mais interessante para ler um arquivo linha por linha (somente ler) é usando a função feof(). Sua função é detectar o final de um arquivo (f-End-Of-File). Porém, como já foi dito, essa função só é indicada caso você queria somente ler o arquivo, já que não funcionará com arquivos abertos com as opções ‘a’, ‘w’ e ‘x’.

<?php
$arquivo = fopen('meuarquivo.txt','r');
if ($arquivo == false) die('Não foi possível abrir o arquivo.');
// imprime linha por linha ate detectar o final
while(!feof($arquivo)) {
	echo fgets($arquivo). '<br />';
}
fclose($arquivo);
?>

Observação: Sistemas operacionais diferentes tem convenções de delimitação de linhas diferentes. Quando você escreve num arquivo e deseja inserir uma quebra de linha, você precisa utilizar o(s) caractere(s) de fim de linha adequado(s) em seu sistema operacional. Sistemas baseados no Unix utilizam n como final de linha, sistemas baseados no Windows usam rn e Mac OS usa r.

Exemplo – lendo todo arquivo em um único passo

Em muitos casos temos que ler o arquivo todo. E ler linha por linha nesses casos dá mais trabalho. Nesses casos utilizamos a funcao file_get_contents() que retorna todo o conteúdo de determinado arquivo. Veja como ela funciona:

<?php
$arquivo = fopen('meuarquivo.txt','r');
$string = file_get_contents('meuarquivo.txt');
echo $string;
fclose($arquivo);
?>

O código acima lê todas informações contidas no arquivo ‘meuarquivo.txt’. Ressaltando que não é recomendado ler arquivos muitos grandes de uma só vez. Nesse caso é recomendado ler o arquivo em partes.

3 – Escrevendo nos arquivos

Escrever nos arquivos usando PHP é também muito fácil. Primeiro você deve ter certeza que seu arquivo aberto tenha permissão para escrita. Depois basta utilizar a função fwrite e seus parâmetros. Segue a estrutura da função:

fwrite($ponteiro, $string, $tamanho);

Os argumentos são o ponteiro, a string e o tamanho em bytes.

  • $ponteiro – O ponteiro aqui utilizado, está armazenado na variável que você usou para abrir ou criar o arquivo.
  • $string – O conteúdo textual que você deseja escrever em seu arquivo.
  • $tamanho – É o tamanho em número de bytes que deve ser gravado no arquivo. Opcional.

Exemplo- escrevendo uma simples linha em um arquivo

O código abaixo abrimos o arquivo indicado no modo ‘w+’ permitindo sua escrita. Caso o arquivo não exista, ele será criado. E depois é gravado um pequeno texto em sua linha. É importante observar que o modo ‘w’ cria arquivos mas também trunca o arquivo caso ele exista, ou seja, deleta todo seu conteúdo assim que ele é aberto.

<?php
$arquivo = fopen('meuarquivo.txt','w+');
if ($arquivo) {
	if (!fwrite($arquivo, 'Novo conteúdo')) die('Não foi possível atualizar o arquivo.');
	echo 'Arquivo atualizado com sucesso';
	fclose($arquivo);
}
?>

Exemplo- escrevendo no início de um arquivo

Para escrevermos no início do arquivo podemos abri-lo com a opção ‘r+’. Porém abriremos ele com a opção ‘a+’, que coloca o ponteiro no final do arquivo, e utilizaremos a função rewind() que move o ponteiro para o início do arquivo.

<?php
// abre o arquivo colocando o ponteiro de escrita no final
$arquivo = fopen('meuarquivo.txt','a+');
if ($arquivo) {
	// move o ponteiro para o inicio do arquivo
	rewind($arquivo);
	if (!fwrite($arquivo, 'Novo conteúdo')) die('Não foi possível atualizar o arquivo.');
	echo 'Arquivo atualizado com sucesso';
	fclose($arquivo);
}
?>

Exemplo- escrevendo no final de um arquivo

Para escrever no final do arquivo, utilizaremos o mesmo comando do exemplo anterior. Porém, não utilizaremos a função rewind() para mudar o ponteiro de posição.

<?php
// abre o arquivo colocando o ponteiro de escrita no final
$arquivo = fopen('meuarquivo.txt','r+');
if ($arquivo) {
	if (!fwrite($arquivo, 'Novo conteúdo')) die('Não foi possível atualizar o arquivo.');
	echo 'Arquivo atualizado com sucesso';
	fclose($arquivo);
}
?>

4 – Alterar conteúdo

Concluindo esse tutorial, vamos falar sobre como alterar o conteúdo de um arquivo.

Na teoria, o que devemos fazer é ler o arquivo, linha por linha, em busca do conteúdo a ser alterado. Vamos colocando tudo dentro de uma nova string. Quando for encontrada a linha com o conteúdo a ser alterado, fazemos as modificações e re-escrevemos o arquivo utilizando-se da nova string.

No caso de alterar um arquivo, é importante verificarmos primeiro se ele existe. Para isso poderíamos usar a função file_exists() que verifica a existência de um arquivo. Mas como usaremos o parâmetro ‘r+’ para abrir o arquivo, já será retornado um erro indicando que o arquivo não existe. Isso por que, ao contrário dos outros parâmetros, o ‘r’ não tenta criar um novo arquivo caso o caminho indicado não exista.

Para substituir o conteúdo do arquivo original pelo conteúdo alterado, primeiro vamos apagar o conteúdo do arquivo atual. Para isso usaremos a função ftruncate(). Vamos ao código de exemplo:

Exemplo- lendo e alterando o conteúdo

<?php
// abre o arquivo colocando o ponteiro de escrita no final
$arquivo = fopen('meuarquivo.txt','r+');
if ($arquivo) {
	while(true) {
		$linha = fgets($arquivo);
		if ($linha==null) break;

		// busca na linha atual o conteudo que vai ser alterado
		if(preg_match("/José da Silva:/", $linha)) {
			$string .= str_replace("José da Silva: 27 anos", "José da Silva: 28 anos", $linha);
		} else {
			// vai colocando tudo numa nova string
			$string.= $linha;
		}
	}
	// move o ponteiro para o inicio pois o ftruncate() nao fara isso
	rewind($arquivo);
	// truca o arquivo apagando tudo dentro dele
	ftruncate($arquivo, 0);
	// reescreve o conteudo dentro do arquivo
	if (!fwrite($arquivo, $string)) die('Não foi possível atualizar o arquivo.');
	echo 'Arquivo atualizado com sucesso';
	fclose($arquivo);
}
?>

É isso pessoal! Para escrever esse texto, utilizei como referência o site PHP-Learn-it.com, o W3Schools e o manual do PHP.

Espero que em algum momento essa referência sirva a você!

Só não esquecendo de dizer que para deletar arquivos, utilizamos a função unlink().

Retirado do blog do Samuel Conradi, dica do Henrique Rodrigues  .

// Comente!

comentários

eufacoprogramas

Olá, eu sou a Gabi e eu criei o "Eu Faço Programas" em 2011, quando ainda trabalhava em desenvolvimento web. Atualmente meu trabalho é focado em estratégia digital e redes sociais. Quer saber mais? www.imgabi.com

2 Comentários

  • Responder agosto 30, 2012

    Wholesale jewelry

    bom blog. Eu amo o seu post. Continue a fazer o bem.
    Wholesale jewelry

  • Responder dezembro 12, 2013

    Joelson Campos

    Gostaria de saber se alguém poderia desenvolver um código de um protocolo de rastreador eu tenho o arquivo de protocolo e preciso desenvolver o arquivo em php para integrar

// Siga as boas práticas: Comente!