|
||||||||||||||||
|
||||||||||||||||
Escribiendo en ficheroLeer de fichero es fácil, como hemos visto. Escribir en el no es mucho mas complicado, pero llegados a este punto, tenemos que entender exactamente qué son los modos de apertura y donde se sitúa el puntero en el fichero cuando ejecutamos fopen(). Quedan resumidos en esta tabla:
Modos de apertura admitidos por fopen()
Con esos modos de apertura en mente, vamos a escribir un método para poder escribir dentro de un fichero. Su código es como sigue:
file_operations_wrapper.class.php <?php define ("IS_WINDOWS", true); public function writeToFile($data, $endline = false) { if(is_null($this->_fileHandler)) { throw new Exception("THE HANDLER FOR THE FILE IS NOT OPEN"); } else { if($this->_openMode == MODE_READ) { throw new Exception("THE MODE IS SET TO READ-ONLY. WRITING IN THIS MODE IS NOT ALLOWED"); } else { if($endline) { $data .= (IS_WINDOWS) ? "\r\n" : "\n"; } fwrite($this->_fileHandler, $data); } } } public function writeLineToFile($data) { $this->writeToFile($data, true); } ?> En realidad, son dos métodos, solo que uno llama al otro y le especifica que agregue un \n al final de los datos a escribir. Se comprueba que el fichero esté abierto y que modo no sea el de solo lectura, y se escribe la cadena pasada en $data. Asimismo, hemos creado una constante para determinar si estamos en un sistema Windows. En caso de ser así, lo que pondremos al final será la combinación de caracteres que pide Windows para entender que es un fin de línea. Ahora, vamos a probar a ver qué pasa con diferentes modos de escritura en el fichero. Primero vamos a definir nuestro fichero de texto, será muy sencillo, como sigue:
Primera linea de texto Segunda linea de texto Tercera linea de texto Cuarta linea de texto Quinta linea de texto <?php $test = new FileOperationsWrapper("test.txt", MODE_READ_PLUS); echo $test->readLine()."<br/>"; echo $test->readLine()."<br/>"; $test->writeLineToFile("Una linea de texto"); ?> En este modo, el fichero debe existir previamente, al igual que en el modo de solo lectura. En caso de no hacerlo, nos saldrá un error de 'Uncaught Exception' (teóricamente esto debería estar en un try-catch, pero estamos testeando, así que...). Al ejecutar este código y abrir el fichero, observamos que lo que contiene es lo siguiente:
Primera linea de texto Segunda linea de texto Una linea de texto to Cuarta linea de texto Quinta linea de texto Lo cual nos puede dejar un poco confusos si no entendemos qué es lo que ha pasado aquí. Al abrir el fichero, con modo MODE_READ_PLUS, o sea "r+", nos ha situado el puntero al inicio del fichero. Hemos sacado dos líneas del mismo, y el puntero se ha situado al inicio de la tercera línea. Al escribir, lo que hemos hecho ha sido sustituir los caracteres de esa línea por la línea "Una línea de texto\n", pero como "Tercera linea de texto\n" tiene mas caracteres que lo que hemos escrito, no perdemos los caracteres que la cadena no ha sido capaz de sobreescribir. Los \n serían \r\n en sistemas Windows, por cierto. Puede parecer un comportamiento raro, pero es exactamente el mismo que la tecla INSERT del teclado. Va reemplazando texto existente según vamos escribiendo. Es interesante que veamos que el puntero interno es recordado por el descriptor, lo que puede ser una bendición o una maldición dependiendo de lo que queramos hacer. Mas adelante veremos una forma de que esto no sea un problema. Ahora vamos a probar a abrir el fichero en modo de escritura. Os recomiendo en este punto que conservéis el fichero original, pues os hará falta para ver las cadenas de texto que van saliendo de las diferentes llamadas, y el modo de escritura puro borrará todo el contenido del fichero.
<?php $test = new FileOperationsWrapper("text.txt", MODE_WRITE); $test->writeLineToFile("Una linea de texto"); ?> El texto que había en el fichero ha sido borrado y sustituido por la cadena "Una linea de texto\n". Así pues, el modo de escritura puro, "w" es el que debemos usar si lo que queremos es escribir en un fichero y nada mas. El que el fichero exista o no no es importante para este modo, porque lo crea de no existir. Ahora veamos el modo append. Es importante que tengamos el fichero original (el de las cinco líneas), para poder ver qué le ha pasado tras usar este modo.
<?php $test = new FileOperationsWrapper("test.txt", MODE_APPEND); $test->writeLineToFile("Una línea de texto"); ?> Al ejecutar ese código, el resultado de lo que tenemos en el fichero es éste:
Primera linea de texto Segunda linea de texto Tercera linea de texto Cuarta linea de texto Quinta linea de texto Una linea de texto Con lo que podemos ver que el modo de anexado "a", que hemos definido como MODE_APPEND, sitúa el puntero al final del fichero y es a partir de ahí donde comienza a escribir el texto. Este es el modo para escribir texto al final de un fichero, manteniendo todo lo que ya esté escrito. En la siguiente parte veremos los modos +, que tienen su miga porque no todos se comportan igual.
|
||||||||||||||||
|
||||||||||||||||