W3docs

Sistema de archivos PHP

Aprende las funciones del sistema de archivos PHP para crear, leer, escribir y eliminar archivos y directorios en tus scripts.

Introducción

Las funciones del sistema de archivos de PHP permiten que tus scripts lean y escriban en el disco del servidor: creando, leyendo, actualizando y eliminando archivos, y gestionando directorios. Son la base de cualquier cosa que necesite persistir datos fuera de una base de datos: archivos de registro, informes generados, archivos subidos por usuarios, configuración, cachés y trabajos de importación/exportación.

Este artículo explica las dos formas principales de trabajar con archivos (la familia basada en manejadores construida alrededor de fopen(), y los helpers de un solo paso como file_get_contents()), muestra ejemplos ejecutables para cada una, y señala los problemas de permisos y manejo de errores que suelen causar dificultades en producción.

Dos formas de trabajar con archivos

PHP ofrece dos estilos, y elegir el correcto mantiene tu código simple:

  1. Helpers de un solo pasofile_get_contents() y file_put_contents() leen o escriben un archivo completo en una sola llamada. Úsalos cuando el archivo cabe cómodamente en memoria (archivos de configuración, JSON/CSV pequeños, plantillas). Son la opción más corta y legible.
  2. Funciones basadas en manejadoresfopen(), fread(), fwrite() y fclose() te dan un manejador de archivo (un recurso) que lees o escribes de forma incremental. Úsalos para archivos grandes que quieras transmitir línea a línea sin cargar todo en memoria, o cuando necesites mantener un archivo abierto durante muchas operaciones.

Operaciones con archivos

PHP proporciona varias funciones para trabajar con archivos. Estas funciones te permiten crear, abrir, leer, escribir y eliminar archivos. Las funciones de archivo más utilizadas incluyen:

  • fopen(): Abre un archivo y devuelve un manejador. Toma dos argumentos: el nombre del archivo y el modo en que abrirlo (ver la tabla más abajo).
  • fclose(): Cierra un manejador de archivo abierto y vacía cualquier escritura en búfer al disco.
  • fwrite(): Escribe una string en un archivo abierto, devolviendo el número de bytes escritos.
  • fread(): Lee un número determinado de bytes desde un archivo abierto.
  • feof(): Devuelve true una vez que se ha llegado al final del archivo — útil como condición de bucle al leer.
  • unlink(): Elimina un archivo.
  • filesize(): Devuelve el tamaño de un archivo en bytes.
  • file_exists(): Comprueba si existe un archivo o directorio antes de actuar sobre él.

Para tareas simples de lectura/escritura, prefiere file_get_contents() y file_put_contents(), que manejan la apertura, lectura/escritura y cierre en una sola llamada.

Modos de archivo para fopen()

El segundo argumento de fopen() controla qué puedes hacer con el manejador y qué ocurre con el contenido existente. Los modos más comunes son:

ModoSignificado
"r"Solo lectura. El puntero comienza al inicio. Falla si el archivo no existe.
"w"Solo escritura. Trunca el archivo a longitud cero (o lo crea).
"a"Solo escritura, añadir. Crea el archivo si no existe; el contenido existente se conserva.
"x"Solo escritura, pero falla si el archivo ya existe — modo seguro de "crear nuevo".
"r+"Lectura y escritura. Puntero al inicio; el archivo debe existir.

Atención: "w" elimina el contenido existente en el momento en que abres el archivo. Si quieres añadir a un registro en lugar de sobreescribirlo, usa "a".

Operaciones con directorios

PHP también proporciona funciones para trabajar con directorios. Estas funciones te permiten crear, eliminar y manipular directorios. Algunas de las funciones de directorio más utilizadas incluyen:

  • mkdir(): Esta función se usa para crear un directorio.
  • rmdir(): Esta función se usa para eliminar un directorio.
  • opendir(): Esta función se usa para abrir un directorio.
  • readdir(): Esta función se usa para leer el contenido de un directorio.
  • closedir(): Esta función se usa para cerrar un directorio abierto.

Ejemplos

Veamos cómo se usan estas funciones en la práctica.

Crear y escribir un archivo

Para crear un archivo y escribir en él, ábrelo en modo escritura con fopen(), escribe con fwrite() y luego siempre cierra con fclose():

<?php

$file = fopen("example.txt", "w");
if ($file === false) {
    exit("Error opening file");
}
fwrite($file, "Hello, world!");
fclose($file);

Esto crea example.txt en el mismo directorio que el script (reemplazándolo si ya existe), escribe Hello, world! y cierra el manejador.

La misma tarea con el helper de un solo paso es una sola línea — este es el estilo preferido para archivos pequeños:

<?php

file_put_contents("example.txt", "Hello, world!");

Leer un archivo

Para leer un archivo con un manejador, ábrelo en modo lectura y usa fread(). Pasar filesize() le indica a fread() cuántos bytes leer:

<?php

$file = fopen("example.txt", "r");
if ($file === false) {
    exit("Error opening file");
}
echo fread($file, filesize("example.txt"));
fclose($file);

Para archivos pequeños, file_get_contents() hace lo mismo en una sola llamada:

<?php

echo file_get_contents("example.txt");

Leer un archivo línea por línea

Para archivos grandes, lee línea por línea con fgets() para no cargar todo el archivo en memoria. El bucle se ejecuta hasta que feof() informa el fin del archivo:

<?php

$file = fopen("example.txt", "r");
if ($file === false) {
    exit("Error opening file");
}
while (!feof($file)) {
    $line = fgets($file);
    echo $line;
}
fclose($file);

Añadir contenido a un archivo

Para agregar a un archivo sin borrar lo que ya está, ábrelo en modo añadir ("a"). Este es el modo correcto para registros:

<?php

$file = fopen("log.txt", "a");
fwrite($file, "New log entry\n");
fclose($file);

Crear un directorio

Para crear un directorio, usa la función mkdir():

<?php

mkdir("example_directory");

Esto crea un directorio llamado example_directory junto al script. Para crear directorios anidados en una sola llamada, pasa el modo y el indicador recursivo:

<?php

mkdir("parent/child/grandchild", 0755, true);

Nota: mkdir() requiere permiso de escritura en el directorio padre. El tercer argumento (true) habilita la creación recursiva de directorios intermedios.

Eliminar un archivo

Para eliminar un archivo, usa la función unlink():

<?php

if (file_exists("example.txt")) {
    unlink("example.txt");
}

Verificar con file_exists() primero evita una advertencia cuando el archivo ya no existe.

Buenas prácticas

  • Cierra siempre los manejadores. Cada fopen() debe ir acompañado de fclose() para que las escrituras en búfer se vacíen y el recurso se libere.
  • Comprueba los valores de retorno. fopen(), mkdir() y unlink() devuelven false en caso de fallo — protégete contra ello en lugar de asumir el éxito.
  • Ten en cuenta los permisos. La mayoría de los errores de "permiso denegado" provienen de que el usuario del servidor web no es propietario del directorio de destino, no de tu código.
  • Elige la herramienta adecuada. Recurre a file_get_contents() / file_put_contents() para trabajar con archivos completos; usa la familia fopen()/fread() solo cuando necesites transmisión.

Conclusión

Las funciones del sistema de archivos proporcionan la base para la gestión de archivos y directorios en PHP. Al entender la diferencia entre los helpers de un solo paso y la transmisión basada en manejadores, elegir el modo correcto de fopen() y cerrar los manejadores de forma segura, puedes construir aplicaciones robustas que almacenen datos y configuración de manera confiable. Para profundizar más, explora Manejo de archivos PHP, Abrir/Leer archivos PHP y trabajo con directorios.

Práctica

Práctica
¿Qué funciones se pueden usar en PHP para manejar archivos y directorios?
¿Qué funciones se pueden usar en PHP para manejar archivos y directorios?
Was this page helpful?