55 Php. Manejo De Ficheros Externos

1,586 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,586
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
40
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

55 Php. Manejo De Ficheros Externos

  1. 1. Manejo de ficheros externos Utilización de ficheros Función fopen() externos En esta tabla tienes los parámetros modo de la función fopen de apertura de ficheros. PHP dispone de funciones Valores del parámetro modo de la función fopen mediante las cuales se pueden crear, modificar, borrar y leer Valor Funcionalidad ficheros de cualquier tipo así como r Abre el fichero en modo lectura y coloca el puntero al comienzo del fichero extraer información sobre ellos y sus contenidos. r+ Abre el fichero en modo lectura y escritura y coloca el puntero al comienzo del fichero Abre el fichero en modo escritura y coloca el puntero al comienzo del fichero, reduce su tamaño a Abrir o crear ficheros w cero y si el fichero no existe intenta crearlo Para crear o modificar ficheros se Abre el fichero en modo lectura y escritura y coloca el puntero al comienzo del fichero, reduce w+ su tamaño a cero y si el fichero no existe intenta crearlo utiliza la instrucción: Abre el fichero en modo escritura y coloca el puntero al final del fichero y si no existe intenta $f1=fopen(fichero,modo) a crearlo $f1 es una variable que recoge el Abre el fichero en modo lectura y escritura y coloca el puntero al final del fichero y si no existe a+ intenta crearlo identificador del recurso, un valor importante (será utilizado para referirnos a este fichero en Un fichero de pruebas instrucciones posteriores), fichero es el nombre (con extensión) del Hemos creado un fichero llamado domingo.txt para poder utilizarlo en los ejemplos. fichero a abrir o crear y deberá Su contenido es exactamente el siguiente (incluidos los saltos de línea): escribirse entre comillas, y modo, que es una cadena que debemos poner entre comillas, el indicador Esto es un ejemplo para comprobar del modo de apertura elegido. si funcionan o no los saltos de linea en un documento de texto En la tabla de la derecha hemos que será leido desde php enumerado las opciones de ese parámetro. Si el fichero que pretendemos abrir está en un directorio distinto al del Un ejemplo de algunas funciones sobre ficheros script, debe incluirse el path completo delante del nombre del <? fichero y la cadena resultante debe /* abrimos con w+ con lo cual borramos el contenido ir entre comillas. y creamos el fichero en el caso de que no existiera */ $f1=fopen("sabado.txt","w+"); ¡Cuidado! # escribimos en el fichero vacio Si incluimos, junto con el nombre fwrite($f1,"Esta es la primera linea que escribimos en el fichero<br>"); del fichero, un path hay que tener #cerramos el fichero muy presente que bajo Windows fclose($f1); hemos de utilizar siempre el echo "<H2>Este es el resultado después del primer fwrite</H2><br>"; separador anti-slash (). include("sabado.txt"); # abrimos con r+ con lo cual sobreescribiremos Cerrar ficheros # en el fichero preexistente Una vez finalizado el uso de un $f1=fopen("sabado.txt","r+"); fichero es necesario cerrarlo. Para # escribimos en al principio del fichero preexistente ello PHP dispone de la siguiente # ya que al abrir un fichero en este modo el puntero intrucción: # se situa al comienzo del fichero fputs($f1,"Esto se sobreescribe"); fclose($f1) #cerramos el fichero Esta función - que devuelve un fclose($f1); valor booleano- permite cerrar el echo "<H2>Este es el resultado después del segundo fwrite</H2><br>"; fichero especificado en $f1 que, include("sabado.txt"); como recordarás, es el valor del # abrimos con a+ con lo cual AÑADIREMOS identificador de recurso que le # al fichero preexistente ya que el modo de apertura fue asignado automaticamente por # situa el puntero al final del fichero PHP en el momento de la apertura. $f1=fopen("sabado.txt","a+"); # escribimos al final del fichero preexistente Punteros internos fputs($f1," Esto se añadirá al final<br>"); #cerramos el fichero PHP dispone de funciones para fclose($f1); situar sus punteros internos y echo "<H2>Este es el resultado después del tercer fwrite</H2><br>"; también para determinar la include("sabado.txt"); posición a la que apuntan en un echo "<h2>Leyendo con fgetc</h2><br>"; momento determinado. # abrimos con r+ con lo cual podemos LEER y AÑADIR # al fichero preexistente Se trata de las siguientes: $f1=fopen("sabado.txt","r+"); # leemos el primer caracter del fichero feof($f1) # ya que el apuntador esta el principio Es un operador booleano que $z=fgetc($f1); devuelve CIERTO (1) si el puntero # imprimimos el primer carácter señala el final del fichero y FALSO echo "He leido el primer carácter: ",$z,"<br>"; si no lo hace. /* leemos el segundo caracter del fichero ya que el apuntador se ha movido a esa posición al leer rewind($f1) anteriormente el primer carácter. Coloca el puntero interno al OBSERVA que NO HEMOS CERRADO AUN EL FICHERO */ comienzo del fichero indicado por $z=fgetc($f1); el identificador del recurso $f1. # este es el nuevo valor de la variable $z echo "He leido el segundo carácter: ",$z,"<br>"; fseek($f1, posición) /* leemos el siguiente caracter del fichero Sitúa el apuntador del fichero ya que el apuntador se ha movido a una nueva posición señalado por el identificador del Recuerda que NO HEMOS CERRADO AUN EL FICHERO */ recurso $f1 en la posición $z=fgetc($f1); (expresada en bytes) señalada por # este es ahora el valor de la variable $z posición. echo "He leido el tercer carácter: ",$z,"<br>"
  2. 2. echo "<h2>Ahora el puntero está en el tercer caracter<br>"; ftell($f1) echo "fgets empezará a leer a partir de el</H2>";; $z=fgets($f1,200); Devuelve (expresada en bytes) la echo "Con fgets he leido esto: ",$z,"<br>"; posición actual del puntero #Ahora cerramos el fichero interno del fichero. fclose($f1); echo "<br><H2>Al abrir el fichero de nuevo fgets ¡Cuidado! comienza desde el principio</h2><br>"; Antes de utilizar funciones es #Abrimos de nuevo el fichero necesario que el fichero que señala $f1=fopen("sabado.txt","r"); el identificador de recursos haya #Leemos su contenido sido abierto. $za=fgets($f1,5000); #Presentamos el contenido Lectura de ficheros echo $za; #Ahora cerramos el fichero La lectura de los contenidos de un fclose($f1); fichero puede hacerse de dos maneras: sin apertura previa o con echo "-------------------------------------------------------------- apertura previa del mismo. <br>"; ?> Lectura de ficheros <h2>Aqui veremos el contenido (sin etiquetas HTML)de una pagina web</H2> sin apertura previa <? # Escribimos la dirección completa de la página y Las funciones que permiten la # la abrimos en modo solo lectura lectura de ficheros sin haber sido abiertos previamente son las $f1=fopen("http://localhost/cursoPHP/php55.php","r"); siguientes: # Escribimos un bucle para que vaya leyendo # cada una de las líneas hasta llegar al final del fichero readfile(fichero) while (!feof($f1)) { $z = fgetss($f1, 1024); Escribe directamente en el punto echo $z,"<br>"; de inserción del script el contenido } completo del fichero. #Cerramos el fichero ¡Atención! fclose($f1); #Borramos el fichero antes de salir La función readfile escribe el unlink("sabado.txt"); contenido del fichero sin necesidad ?> de ir precedido por echo ni print. Si se pone echo o se recoge en Ver ejemplo83.php una variable, además de su contenido añadirá un número que indica el tamaño del fichero Otro ejemplo completando el anterior expresado en bytes. $var=file(fichero) <? # Abrimos el fichero en modo lectura Crea $var –un array escalar– $f1=fopen("domingo.txt","r"); cuyos elementos tienen como # Al anteponer echo a fpassthru valores los contenidos de cada una # NOS APARECERA AL FINAL EL TAMAÑO DEL FICHERO de las líneas del fichero. echo fpassthru($f1),"<br>"; Una línea termina allí donde se /* Abrimos de nuevo el fichero haya insertado un salto de línea RECUERDA QUE FPASSHRU LO CIERRA AUTOMATICAMENTE en el fichero original. DESPUES DE EJECUTAR LA INSTRUCCIÓN */ $f1=fopen("domingo.txt","r"); Lectura de ficheros # Este bucle nos escribirá cada una de las con apertura previa #lineas del fichero while(!feof($f1)){ Para la utilización de estas funciones los ficheros han de ser $z=fgets($f1,4000); abiertos en un modo que permita echo $z,"<br>"; la lectura. } # Situamos el puntero La función que permite la lectura #al comienzo del fichero completa del fichero es: rewind($f1); # Reescribimos el fichero fpassthru($f1) while(!feof($f1)){ Esta función presenta algunas $z=fgets($f1,4000); peculiaridades importantes: echo $z,"<br>"; } • Cierra el fichero de forma # Situamos de nuevo el puntero automática después de la lectura. #al comienzo del fichero Por esa razón, si se escribe la rewind($f1); función fclose a continuación de # Situamos el puntero fpassthru, se produce un error. #señalando el byte número 15 del fichero • Si el resultado se recoge en una fseek($f1,15); variable, o si va precedido de # Releemos el fichero echo, además de escribir el #ahora la primera linea estar incompleta contenido del mismo, añadirá el #LE FALTARAN LOS 15 PRIMEROS CARACTERES número de bytes que indican su while(!feof($f1)){ tamaño. $z=fgets($f1,4000); fgets($f1,long) echo $z,"<br>"; } Extrae del fichero señalado por el # volvemos el puntero al comienzo del fichero $f1 una cadena –que comienza rewind($f1); en la posición actual del puntero– #leemos la primera linea y cuya longitud está limitada por $z=fgets($f1,4000); el menor de estos tres valores: echo $z,"<br>"; • El valor (en bytes) indicado en # Determinamos LA POSICION ACTUAL DEL PUNTERO long. echo ftell($f1),"<br>"; # Cerramos el fichero • La distancia (también en bytes) fclose($f1); desde la posición actual del echo "_________________________________________<br>"; puntero hasta el final del fichero. # leemos el fichero y lo presentamos # en diferentes modalidades • La distancia que hay entre la $pepe=readfile("domingo.txt");
  3. 3. posición actual del puntero y el readfile("domingo.txt"); primer salto de línea. echo $pepe, "<br>"; fgetc($f1) #leemos el fichero y lo recogemos #en un array Extrae el caracter siguiente al $z=file("domingo.txt"); señalado por la posición actual del #Al presentar la variable solo puntero. #nos aparecerá la palabra array echo $z,"<br>"; Escribir en un fichero # presentamos el contenido del array foreach($z as $linea=>$texto) { echo "Linea: ",$linea," Texto: ",$texto,"<br>"; Una vez abierto un fichero -en modo que permita escritura- la }; función PHP que nos permite # copiamos el fichero con mensaje de resultado escribir en el es la siguiente: if (!copy("domingo.txt", "otrodomingo.txt")) { print("Error en el proceso de copia<br>n"); fwrite($f1,"texto",long) }else{ print "<br>Fichero copiado con exito"; donde: $f1 sigue siendo el } identificador de recurso, texto la cadena de texto a insertar en el # renombramos un fichero con mensaje de resultado fichero y long el número máximo if (!rename("otrodomingo.txt", "otrolunes.txt")) { de caracteres que han de print("Error en el proceso de renombrado<br>"); insertarse. }else{ print "<br>Fichero renombrado con exito"; Si la cadena de texto tiene menor } o igual longitud que el parámetro unlink("otrolunes.txt"); long la escribirá en su totalidad, echo "Ultima modificación a las: ",date("h:i:s A", en caso contrario sólo escribirá el filemtime ("domingo.txt"))," del día ", número de caracteres indicados. date("j-n-Y", filemtime ("domingo.txt")); También es posible utilizar: echo "<br>El tamaño del fichero es: ", filesize("domingo.txt")," bytes<br>"; fputs($f1,"texto",long) echo "<br>El fichero es tipo: ", filetype("domingo.txt")," <br>"; echo "<br>Saldrá un 1 si el fichero existe: ",file_exists("domingo.txt"); que en realidad es un alias de la ?> función anterior. ¡Atención! Ver ejemplo84.php Estas funciones realizan la inserción de la cadena a partir de la posición a la que apunte el puntero en el momento de ser Los valores del array devuelto por la función stat invocadas. Indice Significado Sintaxis Resultado Si el fichero ya existiera y contuviera datos los nuevos datos 0 Dispositivo <? echo $d[0] ?> 2 se sobrescribirían sobre el 1 I node <? echo $d[1] ?> 0 contenido anterior. 2 Modo de protección de I node <? echo $d[2] ?> 33206 Para poder añadir contenidos a un 3 Número de enlaces <? echo $d[3] ?> 1 fichero el puntero deberá apuntar el final del fichero preexistente y 4 Id de usuario del propietario <? echo $d[4] ?> 0 estar abierto en un modo que permita añadir contenidos. 5 Id de grupo del propietario <? echo $d[5] ?> 0 6 tipo de dispositivo si es un inode device * <? echo $d[6] ?> 2 Borrado de ficheros 7 Tamaño en bytes <? echo $d[7] ?> 126 8 Fecha del último acceso <? echo $d[8] ?> 1150840800 Para borrar ficheros se utiliza la siguiente instrucción: 9 Fecha de la última modificación <? echo $d[9] ?> 1119364802 10 Fecha del último cambio <? echo $d[10] ?> 1150914775 unlink(fichero) 11 Tamaño del bloque para el sistema I/O * <? echo $d[11] ?> -1 fichero ha de ser una cadena que contenga el nombre y la extensión 12 Número de bloques ocupados * <? echo $d[12] ?> -1 del fichero y, en su caso, también Los valores señalados con * devuelven -1 en algunos sistemas operativos, entre ellos Windows el path. Duplicado de ficheros Ejemplo de un contador de visitas La función: <? /* comprobamos si existe el fichero contador. Si existe copy(fich1, fich2) leemos las visitas registradas e incrementamos su valor en una unidad Copia el fichero fich1 (debe Si no existe, registramos 1 como valor de número de visitas*/ indicarse nombre y extensión) en if(file_exists("contador.txt")){ otro fichero cuyo nombre y /* abrimos el fichero en modo lectura y escritura (r+) con lo que extensión se establecen en la el puntero se colocará al comienzo del fichero */ cadena fich2. $f1=fopen("contador.txt","r+"); # leemos el contenido del fichero Esta función devuelve un valor $visitas=(int)(fgets($f1,10)); booleano indicando si la copia se # lo aumentamos en una unidad ha realizado con éxito TRUE (1) o FALSE (nul) si por alguna razón no $visitas++; ha podido realizarse la copia. # colocamos el puntero al comienzo del fichero para que # al guardar en nuevo valor sobreescriba el anterior rewind($f1); Renombrar ficheros }else{ /*abrimos el fichero en modo lectura y escritura con (w+) La función: de modo que se cree automaticamente al no existir*/ $f1=fopen("contador.txt","w+"); rename(fich1, fich2) #asignamos uno como valor a número de visitas cambia el nombre del fichero fich1 $visitas=1; (hay que poner nombre y } extensión) por el indicado en la /* escribimos el número de visitas en el fichero. En cualquiera cadena fich2. de los casos el puntero estará al comienzo del fichero, por tanto cuando existan valores serán sobreescritos */ También devuelve TRUE o FALSE.
  4. 4. fwrite($f1,$visitas,10); Si tratamos de cambiar el nombre print("Esta página ha sido visitada ".$visitas." veces"); a un fichero inexistente nos dará fclose($f1); error. ?> Funciones informativas Ver contador PHP dispone de funciones que nos facilitan información sobre Guardar y leer datos transferidos mediante un formulario ficheros. Algunas de ellas son las siguientes: Aunque el modo más habitual de guardar información suele ser los servidores de bases file_exists(fichero) de datos (MySQL, por ejemplo) la utilización de ficheros ofrece interesantes posibilidades de almacenamiento de información. Esta función devuelve TRUE si el fichero existe, en caso contrario Este es un ejemplo muy sencillo, en el que mediante un formulario tal como el que devuelve FALSE. aparece en el recuadro puede transferirse y almacenarse la información en un fichero. filesize(fichero) <form name="fichero" method="post" action="escribe.php"> Devuelve el tamaño del fichero <input type="text" name="nombre"> expresándolo en bytes. En caso de <input type="text" name="apellido"> que el fichero no existiera nos dará <input type="edad" name="edad"> un error. <input type="submit" value="enviar"> </form> filetype(fichero) Devuelve una cadena en la que se Los datos transferidos mediante un formulario como el anterior podrían ser registrados indica el tipo del fichero. En caso y visualizados mediante un script como este: de que el fichero no existiera nos dará un error. <? filemtime(fichero) /*abrimos el fichero en modo a+ para permitir que se cree en caso de no existir, que permita los modos lectura Devuelve –en tiempo Unix– la fecha de la última modificación del y escritura y que escriba al final del fichero */ fichero. $f1=fopen("escribiente.txt","a+"); # hacemos un bucle para leer los valores transferidos stat(fichero) # desde el formulario y recogidos en el array $_POST foreach($_POST as $v){ Devuelve un array que contiene /* añadimos "rn" a cada valor para que se inserte información sobre el fichero. un salto de línea y que cada valor sea recogido en En la tabla de la derecha puedes una línea distinta en el fichero ver los contenidos asociados a Limitamos las entradas a 150 caracteres*/ cada uno de sus índices. fwrite($f1,$v."rn",150); } Recogeremos en un array, que /* para comprobar que los nuevos datos han sido agregados llamaremos $d, el resultado de la y visualizar el contenido integro del fichero situamos el función stat aplicada sobre el puntero interno al comienzo del mismo */ fichero domingo.txt. rewind($f1); Para ello vamos a utilizar la /* creamos un bucle que vaya leyendo todas las líneas siguiente sintaxis: hasta encontrar el final del fichero */ while (!feof($f1)) { $d=stat("domingo.txt") /* vamos leyendo el contenido de cada línea del fichero y aunque establecemos en 250 el número de carácteres El contenido y significado de los valores asociados a los índices de dado que los saltos del línea aparecerán antes array $d son los que tenemos en serán ellos los puntos de interrupción de cada lectura*/ la tabla de la derecha. $z = fgets($f1,250); #presentamos el resultado de las lecturas echo $z,"<br>"; Otras funciones } # cerramos el fichero Existen otras muchas funciones fclose($f1); relacionadas con el manejo de ?> ficheros y directorios, así como con los permisos de acceso, etcétera. Hemos resumido únicamente las de mayor interés. Ejercicio nº 28 Si quieres profundizar en este tema a través de este enlace Crea un script -puedes llamarlo ejercicio28.php- de modo que al ejecutarlo escriba en un podrás acceder al capítulo del fichero la fecha y hora en que se produjo el acceso. Manual de Referencia oficial de PHP, en el que se describen las Ese mismo script deberá presentar en la página la fecha y hora de la visita anterior y si es la funciones relacionadas con el primera vez que se accede deberá aparecer un mensaje diciendo: «Esta es la primera vez manejo de ficheros. que accedes a esta página». Para obtener los valores de fecha y hora, deberás utilizar las funciones adodb a las que se alude en la página en la que se trata la opción Include. Anterior Indice Siguiente

×