| <<< 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
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.
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.
Para fechar um arquivo use:
fclose(ARQUIVO)
sendo ARQUIVO um ponteiro para arquivo aberto com fopen().
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.
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.
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:
- ARQUIVO é um ponteiro de arquivo aberto com fopen()
- BYTES é o número de bytes a ser deslocado o ponteiro
- ORIGEM é o ponto inicial a partir de onde o ponteiro vai movimentar-se. Pode ser SEEK_SET para início do arquivo, SEEK_CUR para a poisição atual do ponteiro ou SEEK_END para o final do 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 >>> |