Samuel Corradi

Blog

Manipulando arquivos com PHP

programacao, php, desenvolvimento

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:

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.

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

ModoDescriçã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.

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.

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().

Incluir comentário






7 mensagens enviadas

Samuel Corradi

@philippe, repare que no script acima, a modificação é feita lendo o arquivo, alterando o que tem que alterar, e colocando tudo em uma nova string que substituirá o conteúdo original. Então, se quer apagar a linha, basta não copiar ela para a nova string

Philippe

Olá Samuel, veja se vc pode me ajudar...
Quero achar uma linha, assim como no seu ultimo exemplo, e apagar toda a linha. Depois adicionar um novo conteúdo a nessa linha que foi apagada.

No último exemplo que vc deu eu posso alterar um valor determinado. mas não concigo apagar toda linha a qual 'José da Silva:' está.
Quero reescrever toda essa linha sem ter que definir o que devera ser apagado, ou seja, apagar toda linha que "José da Silva:" se encontra... Desde já agradeço..

Victor

cara parabééns eu ja sabia sobre tudo isso , mais acredito que você tenha ajudado bastante pessoas , você e bastante esforçado juntar todo o material ate hoje não encontrei nada melhor que sua materia ( tutorial )

Renato

exatamente o que tava procurando,... muito obrigado,.e belo blog,...
CRTL + D já..!!!!!..
abrço.

fabio mendes ribeiro

olha parabens o ultimo codigo deste tutorial era tudo que eu queria ja tinha procurado muito e nao consegui um que fose facil de entende

muito obrigado voce e nota 10

Samuel Corradi

Fala Jorge! Não consegui entender sua pergunta...

1 - Qual ponto de "leio a linha" você diz?
2 - "Preciso carregar várias variáveis com substr". Você quer pegar trechos de uma linha e colocar cada trecho em uma variável para depois utiliza-los como valores para os campos em um INSERT?

É isso mesmo?

Jorge

Olá Samuel, não sei se pode me ajudar. O que preciso já fiz em Delphi, mas em PHP não tenho idéia.
Nesse ponto que leio a linha, preciso carregar várias variáveis de acordo com substr dessa linha para INSERIR no MySQL
Tem esse exemplo ?

Últimos posts:

Destaques:

PHP Coupé - Desenvolvimento rápido e reaproveitável vForm - Validador universal de formulários

Programming and design by Samuel Corradi