Programación en PHP/Manejo de ficheros

Trabajar con archivos es una parte importante en cualquier lenguaje de programación y PHP no es nada diferente. No importa cuales sean las razones por las que necesites manipular archivos, PHP los acomodará felizmente a través de una gran variedad de funciones. Deberías haber leído y comprendido los conceptos básicos de éste libro antes de seguir aquí.

fopen() y fclose()Editar

fopen() es una de las funciones básicas para la manipulación de archivos. Abre un archivo en un cierto modo (que tu establecerás) y devuelve el recurso del puntero de archivo. Usando este recurso se puede leer y/o escribir en el archivo, antes de cerrarlo con la función fclose().

<?php

$puntero = fopen("datos.txt", "r"); // Abre el archivo sólo para lectura
fclose($puntero); // Cierra el archivo

?>

En el ejemplo anterior se puede observar que el archivo se abre sólo para lectura especificando "r" como el modo. Para ver una lista completa de los modos existentes para fopen() podes encontrarlos en la página Manual PHP.

Abriendo y cerrando el archivo es bien, pero para poder realizar operaciones útiles necesitas saber acerca de las funciones fread() y fwrite().

Cuando PHP finaliza la ejecución de un programa, todos los archivos abiertos son automáticamente cerrados. Asi que por lo tanto no es necesario cerrar un archivo luego de abrirlo y haber trabajado con el mísmo, pero a su vez, es considerado una buena practica de programación.

Lectura de archivosEditar

La lectura de archivos se puede hacer de varias formas. Si tan solo lo que se necesita es el contenido del archivo, se puede usar la función file_get_contents(). Si queremos cada una de las líneas del archivo en una matriz (array) se puede usar el comando file(). Para un control total sobre la lectura del archivo se recomienda utilizar fread().

Por lo general, estas funciones son intercambiables y cada una puede ser utilizada para cumplir con la función de cada una. Las primeras dos no requieren abrir el archivo con fopen() o cerrarlo con fclose(). Éstas funciones son bastante útiles para operaciones rápidas realizadas de una sola vez. Si se planea realizar múltiples operaciones en un archivo es mejor utilizar fopen() en conjunto con fread(), fwrite() y fclose() ya que es mucho más eficiente.

A continuación se muestra ejemplos utilizado las funciones mencionadas anteriormente.

Ejemplo usando file_get_contents():

<?php

$contenido = file_get_contents('datos.txt');
echo $contenido;

?>

El resultado es:

Soy el contenido de datos.txt

Esta función lee el archivo completo como una cadena (o string) para luego ser manipulada como si fuese cualquier otra cadena.

Ejemplo usando file():

<?php

$lineas = file('datos.txt');
foreach ($lineas as $numero => $linea) {
    $numero_de_linea = $numero + 1;
    echo "Linea $numero_de_linea: $linea";
}

?>

El resultado es:

Linea 1: Soy la primera linea de un archivo
Linea 2: Soy la segunda linea de un archivo
Linea 3: Si dijera que soy la cuarta linea del archivo, estaría mintiendo

Esta función lee el archivo completo como una matriz (o array). Cada item en la matriz corresponde a una linea en el archivo.

Ejemplo usando fread():

<?php

$puntero = fopen("datos.txt", "r");
$cadena = fread($puntero, 64);
fclose($puntero);

echo $cadena;

?>

El resultado es:

Los primeros 64 bytes de datos.txt (siendo codificado en ASCII).

Esta función puede leer hasta una cantidad especificada de bytes del archivo y devolviéndolos como una cadena. Para la mayor parte, las primeras dos funciones son preferidas pero hay ocasiones en las que ésta función es necesaria.

Como puedes ver, con estas tres funciones se podrá leer fácilmente datos desde un archivo en la forma que sea conveniente para trabajar con los mismos. El siguiente ejemplo demuestra como estas tres funciones pueden se utilizadas para hacer los trabajos de las otras pero esto es opcional. Puede saltar y pasar hacia la sección Escritura si no está interesado.

<?php

$archivo = "datos.txt";

function detectar_fin_de_linea($contenido) {
    if (false !== strpos($contenido, "\r\n")) return "\r\n";
    elseif (false !== strpos($contenido, "\r")) return "\r";
    else return "\n";
}

/* Esto es equivalente a file_get_contents($archivo) pero menos eficiente */
$puntero = fopen($archivo, "r");
$contenido = fread($puntero , filesize($archivo));
fclose($puntero);

/* Esto es equivalente a file($archivo) pero se requiere buscar el tipo de
   fin de línea. El sistema operativo Windows usa \r\n, Macintosh \r y Unix
   \n. file($archivo) detectará automaticamente el tipo de fin de línea
   mientras que fread()/file_get_contents() no lo harán. */
$fin_de_linea = detectar_fin_de_linea($contenido);
$contenido = file_get_contents($archivo);
$lineas = explode($fin_de_linea, $contenido);

/* Esto es equivalente a file_get_contents($archivo) */
$lineas= file($archivo);
$contenido = implode("\n", $lineas);

/* Esto es equivalente a fread($archivo, 64) si el archivo esta codificado en ASCII */
$contenido = file_get_contents($archivo);
$cadena = substr($contenido, 0, 64);

?>