www.samueldiasneto.com: Tutorial PHP

<<< Voltar Avançar >>>

7. Manipulando arquivos

Abrindo um arquivo
Gravando num arquivo
Fechando um arquivo
Lendo um arquivo
Lendo um caracter por vez
Verificando se um arquivo existe
Verificando o tamanho do arquivo
Apagando um arquivo
Direcionando o ponteiro para o início do arquivo
Verficando quantos bytes foram lidos
Movendo o ponteiro pelo arquivo
Bloqueando um arquivo


Abrindo um arquivo

Para abrir um arquivo usa-se a função fopen:

$arquivo = fopen(PATH,MODO)

onde arquivo é uma variável que armazenará o ponteiro do arquivo, PATH é o caminho do arquivo e MODO pode ser:

r  - leitura
r+ - leitura e gravação
w  - gravação. Se o arquivo existir será substituído
w+ - gravação. Se o arquivo existir será substituído
a  - gravação. Acrescenta ao fim do arquivo
a+ - gravação. Acrescenta ao fim do arquivo 
b  - binário. Utilizado em sistemas que diferenciam arquivos de texto
     de binários (windows)

Lembre-se de testar se o arquivo foi aberto sem problemas. Você pode construir algo como:

@ $arquivo = fopen("/var/www/pedido.txt",'a');
# verificando se o arquivo foi aberto sem problemas
if (!$arquivo)
  {
    echo "<p>O pedido não pode ser processado agora. Tente
mais tarde.</p>";
    exit;
  }

Observe a utilização do operador de supressão de erro para evitar as mensagens de erro padrão do PHP.


Gravando num arquivo

Para gravar num arquivo aberto use as funções fwrite () e fputs (). fputs() é um alias para fwrite. A sintaxe de fwrite () é:

fwrite (ARQUIVO,STRING,COMPRIMENTO)

onde ARQUIVO é um ponteiro para um arquivo aberto com fopen(), STRING é a string a ser gravada no arquivo e COMPRIMENTO é o número de bytes a gravar. Se este parâmetro for fornecido, fwrite gravará a string até alcançar seu final ou até ter gravado COMPRIMENTO bytes.


Fechando um arquivo

Para fechar um arquivo use:

fclose(ARQUIVO)

sendo ARQUIVO um ponteiro para arquivo aberto com fopen().


Lendo um arquivo

Para ler um arquivo usa-se uma das seguintes funções:

fgets()
fgetss()
fgetcsv()
readfile()
fpassthru()
file()
file_get_contents()
fread()

fgets() é usada para ler uma linha do arquivo e sua sintaxe é:

fgets(ARQUIVO,TAMANHO)

onde ARQUIVO é um ponteiro para um arquivo aberto com fopen() e TAMANHO é o tamanho da linha em bytes. Ela lê a linha até encontrar um caractere de nova linha (/n), encontrar um fim de arquivo (EOF) ou ter lido TAMANHO - 1 bytes. Para ler todas as linhas de um arquivo você deve fornecer um código de loop semelhante a:

while(!feof($arquivo))
  {
    $linha = fgets($arquivo,999);
    echo $linha.'<br>';
  }

observe a utilização da funçaõ feof(). Ela verifica se o fim o arquivo foi atingido.

fgetss() é parecida com fgets(), a diferença é que fgetss() retira as tags HTML. Isto é interessante quando você está lendo um arquivo escrito por outra pessoa ou lendo uma entrada do usuário. Uma tag HTML mal colocada no código pode alterar a aparência da página. A sintaxe de fgetss() é:

fgetss(ARQUIVO,TAMANHO,TAGS)

onde TAGS são as tags HTML permitidas.

fgetcsv() é utilizada para dividir linhas do arquivo quando você usar um caracter separador para separar os itens ou campos do registro. Ela é interessante quando trabalhando com arquivos gerados por aplicações que criam arquivos de dados separados por um caracter padrão, como é o caso das planilhas. O resultado é retornado num array. A sintaxe de fgetcsv() é:

fgetcsv(ARQUIVO,TAMANHO,SEPARADOR,CERCADOR)

onde SEPARADOR é o caractere separador (o padrão é a vírgula) e CERCADOR é o caractere que envolve os campos (o padrão é o caractere de aspas duplas ").

Para ler todo o arquivo de uma vez use readfile()

readfile(ARQUIVO)

ARQUIVO é o caminho do arquivo a ser lido. readfile() retorna o número de bytes lidos e exibe o arquivo na saída padrão.

Você também pode ler todo o arquivo usando fpassthru()

fpasthru(ARQUIVO)

neste caso, ARQUIVO é um ponteiro aberto anteriormente com fopen(). A função lê do ponteiro até o final do arquivo e, então, fecha o arquivo. Sendo assim, você pode usar fpasthru() para ler todo o arquivo ou uma parte dele. Ela retorna true ou false dependendo ou não do sucesso na leitura do arquivo.

file() é parecida com readfile()

file(ARQUIVO) 

onde ARQUIVO é o caminho do arquivo a ser lido. Ela lê todo o arquivo e o retorna no formato de um array. Cada linha é um elemento do array.

De forma semelhante, file_get_contents(ARQUIVO) lê todo o arquivo passado, porém o retorna como uma string.

fread() lê uma quantidade específica de bytes do arquivo:

fread(ARQUIVO,BYTES)

onde ARQUIVO é um ponteiro aberto com fopen() e BYTES é o número de bytes a ser lido. A função lê até o número dado de bytes ou até o fim do arquivo, o que ocorrer primeiro.


Lendo um caracter por vez

Para ler um caractere de cada vez use fgetc()

fgetc(ARQUIVO)

onde ARQUIVO é um ponteiro de arquivo aberto com fopen(). Normalmente não é interessante ler todo o arquivo utilizando fgetc() pois ela retorna também o caractere de fim de arquivo (EOF). É melhor ler todo o arquivo usando outra função, porém, se você quiser ler todo um arquivo e exibí-lo numa página HTML, você pode usar um trecho de código parecido com este:

while(!feof($arquivo))
  {
    $caracter = fgetc($arquivo);
    if(!feof($arquivo))
      echo ($caracter=="\n"?'<br>':$caracter);
  }

observe o segundo teste de fim de arquivo, ele é necessário pois, como foi dito acima, fgetc() retorna também o caractere de fim de arquivo. Observe também a utilização da instrução condicional (CONDIÇÃO ? VERDADEIRO : FALSO). Ela foi usada para emitir uma quebra de linha no HTML cada vez que o caracter de nova linha (\n) for lido.


Verificando se um arquivo existe

file_exists(ARQUIVO)

onde ARQUIVO é o caminho do arquivo a ser verificado.


Verificando o tamanho do arquivo

filesize(ARQUIVO)

onde ARQUIVO é o caminho do arquivo. O tamanho do arquivo é retornado em bytes.


Apagando um arquivo

unlink(ARQUIVO)

onde ARQUIVO é o caminho do arquivo.


Direcionando o ponteiro para o início do arquivo

rewind(ARQUIVO)

onde ARQUIVO é um ponteiro de arquivo aberto com fopen().


Verificando quantos bytes foram lidos

ftell(ARQUIVO)

onde ARQUIVO é um ponteiro de arquivo aberto com fopen().


Movendo o ponteiro pelo arquivo

fseek(ARQUIVO,BYTES,ORIGEM)

onde:


Bloqueando um arquivo

Sempre que um arquivo é aberto é interessante bloqueá-lo para que outro usuário não esteja acessando o arquivo ao mesmo tempo. Para isto use flock()

flock(ARQUIVO,OPERAÇÃO) 

onde ARQUIVO é um ponteiro de arquivo aberto com fopen() e OPERAÇÃO é o tipo de bloqueio de acordo com a tabela abaixo:

LOCK_SH - bloqueio de leitura. O arquivo pode ser compartilhado com
          outros usuários.
LOCK_EX - bloqueio de gravação. O arquivo não pode ser compartilhado
LOCK_UN - libera bloqueio existente
LOCK_NB - impede bloqueio ao tentar adquirir um bloqueio
<<< Voltar Avançar >>>