Creando archivos con PHP
Veremos como crear archivos en PHP de diferentes modos. A continuación dejo una lista del contenido en esta entrada.
contenido:
- Introducción
- Creando el archivo con fopen()
- Leer un archivo con fread()
- Escribir un archivo con fwrite()
- Crear el archivo con file_put_contents
Introducción
En PHP hay 2 maneras de crear archivos. La primera es la que abrimos el archivo y lo cerramos lugo como en muchos otros lenguajes y otra es directamente que lo haga con otra función de PHP.
Veamos la Primera, el uso de fopen()
.
Creando el archivo con fopen()
Aunque en este post utilizaremos la función fopen de PHP para crear el archivo, tenga en cuenta que esta función la podemos utilizar para leer el archivo sin hacerle ninguna modificación dependiendo de los parámetros que se le pasen.
la sintaxis de fopen es la siguiente:
Sintaxisfopen ( string $filename , string $mode [, bool $use_include_path = FALSE [, resource $context ]] ) : resource
$filename
es el archivo que se abrirá por ejemplo «/var/www/html» en un servidor windows deberemos escapar las barras invertidas "c:\\ micarpeta\\miarchivo"
agregandole una \ delante de la otra
El parametro $mode
es el modo en que se abrira r(read) es el modo de lectura y w(write) de escritura. El parámetro mode especifica el tipo de acceso que se necesita para el flujo. Esto no quiere decir que ya abierto lo esté leyendo o ya lo varamos a escribir, para ello necesitamos otras funciones como fread()
o fwrite()
Abajo están los distintos modos disponibles:
mode | Descripción |
---|---|
‘r’ | Apertura para sólo lectura; coloca el puntero al fichero al principio del fichero. |
‘r+’ | Apertura para lectura y escritura; coloca el puntero al fichero al principio del fichero. |
‘w’ | Apertura para sólo escritura; coloca el puntero al fichero al principio del fichero y trunca el fichero a longitud cero. Si el fichero no existe se intenta crear. |
‘w+’ | Apertura para lectura y escritura; coloca el puntero al fichero al principio del fichero y trunca el fichero a longitud cero. Si el fichero no existe se intenta crear. |
‘a’ | Apertura para sólo escritura; coloca el puntero del fichero al final del mismo. Si el fichero no existe, se intenta crear. En este modo, fseek() solamente afecta a la posición de lectura; las lecturas siempre son pospuestas. |
‘a+’ | Apertura para lectura y escritura; coloca el puntero del fichero al final del mismo. Si el fichero no existe, se intenta crear. En este modo, fseek() no tiene efecto, las escrituras siempre son pospuestas. |
‘x’ |
Creación y apertura para sólo escritura; coloca el puntero del fichero al
principio del mismo. Si el fichero ya existe, la
llamada a fopen() fallará devolviendo FALSE y
generando un error de nivel E_WARNING . Si
el fichero no existe se intenta crear. Esto es equivalente
a especificar las banderas O_EXCL|O_CREAT para la
llamada al sistema de open(2) subyacente.
|
‘x+’ | Creación y apertura para lectura y escritura; de otro modo tiene el mismo comportamiento que ‘x’. |
‘c’ | Abrir el fichero para sólo escritura. Si el fichero no existe, se crea. Si existe no es truncado (a diferencia de ‘w’), ni la llamada a esta función falla (como en el caso con ‘x’). El puntero al fichero se posiciona en el principio del fichero. Esto puede ser útil si se desea obtener un bloqueo asistido (véase flock()) antes de intentar modificar el fichero, ya que al usar ‘w’ se podría truncar el fichero antes de haber obtenido el bloqueo (si se desea truncar el fichero, se puede usar ftruncate() después de solicitar el bloqueo). |
‘c+’ | Abrir el fichero para lectura y escritura; de otro modo tiene el mismo comportamiento que ‘c’. |
‘e’ | Establecer la bandera ‘close-on-exec’ en el descriptor de fichero abierto. Disponible solamente en PHP compilado en sistemas que se ajustan a POSIX.1-2008. |
Luego tiene 2 parámetros más que son opcionales. No los tocaré en este momento, tal vez en una futura revisión.
Leer un archivo con fread() en PHP
Bueno, hagamos algún ejemplo de lectura de un archivo primero.
Primero necesitaremos un archivo txt para leer por ejemplo 1.txt que contenga un texto cualquiera, en mi caso el texto es "hola a todos y gracias por preferirnos "
.
En el archivo .php que leerá a 1.txt:
<?php $file = fopen("/var/www/html/LF_php/files/1.txt","r"); echo fread($file,filesize("/var/www/html/LF_php/files/1.txt"));
Listo con esto ya deberíamos obtener el texto dentro de 1.txt recuerde que estoy pasando el path del archivo dentro de mí PC.
Escribir un archivo con fwrite()
Creemos algo mucho mas elaborado, Primero creemos un formulario que le diga que archivo leer y luego cargar su contenido en un textarea para ser modificado y guardado
Antes de empezar debo explicar que no subiré ningún archivo, simplemente quiero sacar la información del archivo para luego abrirlo con fopen()
presentarlo en el textarea con fread()
y luego de hacer los cambios escribirlo con fwrite()
.
La sintaxis de fwrite es la siguiente:
fwrite ( resource $handle , string $string [, int $length ] ) : int
¿Ya pensó como hacerlo?
Esta es la manera en que yo lo hice, un archivo index.php para el formulario utilice un archivo read.php para leer el archivo y mostrarlo en el textarea y un archivo write.php para escribirlo.
index.php<form enctype="multipart/form-data" action="read.php" method="post"> <label>Plese select a file to read</label> <input type="file" name="f"> <input type="submit" value="confirm"> </form>read.php
<?php $filename = $_FILES['f']['name']; $filepath = __DIR__."/files/".$filename; //"/var/www/html/LF_php/files/1.txt" $file = fopen($filepath,"r"); echo "<form action=\"write.php\" method=\"post\">"; echo "<div><label>Change file</label></div>"; echo "<div><textarea name=\"content\" style=\"width:350px;\">"; echo fread($file,filesize($filepath)); echo "</textarea ></div>"; echo "<input type=\"hidden\" name=\"filepath\" value=$filepath>"; echo "<input type=\"submit\" value=\"confirm\">"; echo "</form>"; fclose($file); ?>write.php
<?php error_reporting(E_ALL); ini_set("display_errors", 1); $content = $_POST['content']; $file = fopen($_POST['filepath'],"w"); $writed = fwrite($file,$content); if(!$writed){ echo "<p>el archivo no se a podido escribir</p>"; }else{ echo "<p>el archivo se escribio con exito</p>"; } echo "<p><a href=\"index.php\">go back</a></p>";
en caso de necesitar los permisos dejo esto por aquí.
~sudo chown -R www-data:www-data [tu ruta a la carpeta de trabajo] sudo chmod -R g+rw [tu ruta a la carpeta de trabajo]
Bueno y como creamos los archivos pues al hacer fopen con modo «w+» si no existe lo intenta crear esa es una manera fácil de crear un archivo.
¿Cuando puedo llegar a utilizar fopen?
En algún momento podemos crear un sistema el cual cree archivos de nuestro propio proyecto así que no es difícil llegar a usar fopen para crear archivos.
Crear el archivo con file_put_contents
Otra manera fácil de crear un archivo con PHP es la función file_put_contents
. Tal como su nombre lo dice, esta función es para poner datos dentro de un archivo.
file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int
Aunque esta función es más compleja que fopen tiene sus ventajas en cierto punto. Por ejemplo, agregar los datos sin sobreescribir el archivo de una forma mucho más sencilla que fopen utilizando los flags.
flag | Descripción |
---|---|
FILE_USE_INCLUDE_PATH
|
Buscar filename en el directorio incluido.
Véase include_path para más
información.
|
FILE_APPEND
|
Si el fichero filename ya existe, añade
la información al fichero en vez de sobrescribirlo.
|
LOCK_EX
| Adquirir acceso exclusivo al fichero mientras se está ejecutando la escritura. En otras palabras, ocurre una llamada a flock() entre la llamada a fopen() y la llamada a fwrite(). Esto no es indéntico a una llamada a fopen() con el modo «x». |
- Anterior: subiendo archivos con PHP
- Siguiente: Manejando fechas con PHP