teoria_unidad4

22
Curso de PHP 5 – Unidad 4 – Funciones de acceso a ficheros Teoría: Funciones de acceso a ficheros 1 - Objetivos Objetivos Aprender a abrir y a cerrar ficheros, así como saber mostrar su contenido. Entender y saber aplicar las funciones que permiten recorrer ficheros y leer su contenido. Entender y saber aplicar las funciones que permiten modificar el contenido de los ficheros. Saber copiar, borrar, renombrar y conocer los atributos de los ficheros. Entender y saber aplicar las funciones que permiten subir ficheros al servidor y bajarlos, así como validarlos. Saber transformar un fichero de tipo HTML en otro de tipo texto. Aprender a rellenar un SELECT con los ficheros de un directorio. Conocer cómo se tratan los directorios (carpetas) del servidor de red. Saber tratar los permisos y propietarios de los ficheros. 2 - Abrir y cerrar ficheros En esta Unidad 4 vamos a abordar el tratamiento de los ficheros en PHP. Hasta el momento la información que escribíamos se perdía al cerrar el navegador o bien debíamos guardarla en el código fuente PHP. Pero esto último en realidad no es posible hacerlo cuando se trata de una aplicación PHP real cuyo código está en el servidor y el cliente no tiene acceso al mismo sino como mero usuario que se beneficia de su interpretación. Sólo puede hacerlo el dueño de la aplicación de acuerdo con el administrador del servidor. 1 de 22

description

temario y capitulo del curso de php de la unidad 4 del curso

Transcript of teoria_unidad4

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Teora: Funciones de acceso a ficheros

    1 - Objetivos

    Objetivos

    Aprender a abrir y a cerrar ficheros, as como saber mostrar su contenido.

    Entender y saber aplicar las funciones que permiten recorrer ficheros y leer su contenido.

    Entender y saber aplicar las funciones que permiten modificar el contenido de los ficheros.

    Saber copiar, borrar, renombrar y conocer los atributos de los ficheros.

    Entender y saber aplicar las funciones que permiten subir ficheros al servidor y bajarlos, as como validarlos.

    Saber transformar un fichero de tipo HTML en otro de tipo texto.

    Aprender a rellenar un SELECT con los ficheros de un directorio.

    Conocer cmo se tratan los directorios (carpetas) del servidor de red.

    Saber tratar los permisos y propietarios de los ficheros.

    2 - Abrir y cerrar ficheros

    En esta Unidad 4 vamos a abordar el tratamiento de los ficheros en PHP. Hasta el momento la informacin que escribamos se perda al cerrar el navegador o bien debamos guardarla en el cdigo fuente PHP. Pero esto ltimo en realidad no es posible hacerlo cuando se trata de una aplicacin PHP real cuyo cdigo est en el servidor y el cliente no tiene acceso al mismo sino como mero usuario que se beneficia de su interpretacin. Slo puede hacerlo el dueo de la aplicacin de acuerdo con el administrador del servidor.

    1 de 22

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Sin embargo, PHP permite guardar y recuperar informacin a travs de los ficheros, para lo cual dispone de funciones y procedimientos para acceder a los mismos y a su informacin, as como para crearlos, destruirlos, modificar su contenido, etctera. PHP tambin puede tratar las carpetas o directorios.

    En esta la Unidad, pues, vamos a estudiar de forma terico-prctica las diferentes operaciones que se pueden llevar a cabo con los directorios y con los ficheros. Concretamente, en este primer apartado abordamos cmo abrir y cmo cerrar ficheros.

    En el Captulo XXX. Funciones del Sistema de Archivos del Manual de PHP (puede encontrarse en la ayuda del Editor dev-PHP) aparecen hasta 75 funciones de ficheros. En este apartado nos vamos a limitar a explicar brevemente las ms frecuentes y necesarias. Nuestro objetivo es que el alumno aprenda a utilizar algunas para familiarizarse con ellas y poder, luego, utilizar correctamente las que necesite obteniendo informacin en el Manual.

    Nota importante

    Como en los ejemplos y ejercicios de esta Unidad se van a realizar operaciones que pudieran afectar a los ficheros del curso, es imprescindible que, antes de iniciar los ejercicios, el alumno copie a su directorio de trabajo personal los ficheros de tipo texto (txt o php) que aparecen en el directorio C:\CursoPHP5\curso\Alumnos\ficheros_del_curso, para que pueda acceder a ellos y tratarlos sin problemas. En el directorio original no se permiten operaciones de escritura, por lo cual no podra practicar aquellas operaciones que lo exigen, como borrar o renombrar un fichero o un directorio.

    Por otra parte, a continuacin se explica en primer lugar la funcin chdir(), que permite establecer el directorio actual por defecto. En todos sus programas, el alumno ha de ponerla como primera lnea de instrucciones indicando como argumento su directorio de trabajo.

    Por ejemplo, si el directorio se denomina afer001, deber escribir la sentencia chdir("C:\CursoPHP5\curso\Alumnos\afer001"); delante de las lneas de instrucciones donde se tratan los ficheros.

    Otra buena solucin puede ser crear con el Editor dev-PHP o con el Bloc de notas algunos ficheros propios, sean de tipo php o txt, y guardarlos en el propio directorio de trabajo. En este caso no es preciso copiar los ficheros de estos tipos creados por nosotros para realizar las operaciones y archivados en el directorio C:\CursoPHP5\curso\Alumnos\ficheros_del_curso.

    Para poder abrir con el Editor dev-PHP los ficheros de tipo txt, hay que poner en el apartado Nombre de archivo *.* y se mostrarn todos, no slo los del tipo php, antes de seleccionar el que queramos abrir.

    Establecer el directorio por defecto

    Aunque la funcin chdir() pertenece al apartado donde se trata el trabajo con los directorios, se explica aqu por necesidad. Todas las operaciones con ficheros que realice el alumno o alumna han de llevarse a cabo sobre los ficheros presentes en su directorio de trabajo. Por

    2 de 22

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    eso, conviene que en todos sus scripts inserte como primera lnea de cdigo esta funcin para fijar el directorio donde estn o deben crearse los ficheros con los que se va a trabajar.

    La funcin chdir() establece el directorio actual por defecto donde estn archivados o donde se van a archivar los ficheros que se utilicen para realizar diferentes operaciones. Al ejecutarse, comprueba si el directorio pasado como argumento existe o no. En el primer caso esta funcin devuelve True; en el segundo, False. Una vez que se ha establecido el directorio por defecto, si el camino especificado existe, ya no es necesario indicar delante del nombre de fichero el directorio donde debe buscarse o crearse los ficheros que se usen en el mismo script.

    Su sintaxis es la siguiente:

    chdir(nombre completo de directorio);

    La mejor forma de usar esta funcin es incluyndola dentro de una estructura condicional de la forma siguiente:

    if (chdir("C:\CursoPHP5\curso\Alumnos\ficheros_del_curso")) echo "El directorio \"C:\\CursoPHP5\\curso\\Alumnos\\ficheros_del_curso\" existe y ha quedado fijado como actual.";else echo "El directorio \"C:\\CursoPHP5\\curso\\Alumnos\\ficheros_del_curso\" no existe y no se ha podido fijar como actual.";

    Puede verse cmo funciona este cdigo en el Ejemplo 1 de esta Unidad.

    Abrir un fichero

    Siempre que trabajemos con ficheros para escribir, modificar o leer su contenido, es imprescindible realizar un proceso que est integrado, al menos, por tres operaciones:

    1. Abrir el fichero.

    2. Realizar las operaciones de lectura o escritura previstas.

    3. Cerrar el fichero.

    La funcin fopen() permite abrir un fichero para trabajar con el mismo. Al ejecutarse, comprueba si el fichero pasado como primer argumento existe o no. En el primer caso esta funcin devuelve True; en el segundo, False. Por ello, conviene incluir tambin esta funcin dentro de una estructura condicional que nos informe de la apertura o no del fichero especificado.

    sta es su sintaxis:

    fopen("nombre del fichero","modo de apertura", entero para mirar tambin en el camino fijado en la instruccin include);

    donde

    El primer parmetro es el nombre exacto del fichero que se desea abrir. Si dentro de este

    3 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo1/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    argumento se indica el directorio por no haber usado previamente la funcin chdir(), es imprescindible poner las dos barras \\, para que la barra de directorio sea interpretada correctamente, es decir, como signo textual de directorio y no como un smbolo del lenguaje HTML.

    El segundo parmetro es el modo de apertura, que debe ponerse tambin entre comillas. Un fichero puede abrirse de varios modos, cada uno de los cuales se indica con el signo correspondiente:

    'r' - Abre el fichero para slo lectura; sita el puntero del fichero al comienzo del mismo.

    'r+' - Abre el fichero para lectura y escritura; sita el puntero del fichero al comienzo del fichero.

    'w' - Abre el fichero para slo escritura; sita el puntero del fichero al comienzo del fichero y trunca el fichero con longitud cero. Si el fichero no existe, trata de crearlo.

    'w+' - Abre el fichero para lectura y escritura; sita el puntero del fichero al comienzo del mismo y trunca el fichero con longitud cero. Si el fichero no existe, trata de crearlo.

    'a' - Abre el fichero slo para escribir (aadir); sita el puntero del fichero al final del mismo. Si el fichero no existe, trata de crearlo.

    'a+' - Abre el fichero para lectura y escritura (aadiendo); sita el puntero del fichero al final del mismo. Si el fichero no existe, trata de crearlo.

    Adems de uno de los anteriores, este argumento, denominado mode, puede contener la letra 'b'. Esto es til para sistemas que diferencian entre ficheros binarios y de texto, como Windows. Es intil en Unix. Si no se necesita, es ignorado.

    El tercer parmetro, opcional, permite indicar que la bsqueda del fichero se haga tambin en el camino donde se hallan los ficheros especificados en la orden include. En este caso, hay que poner el valor 1.

    Veamos un ejemplo:

    if (fopen("Ficheros_1.php","r")) echo "El fichero \"Ficheros_1.php\" existe y ha quedado abierto.";else echo "El fichero \"Ficheros_1.php\" no existe.";

    En las instrucciones anteriores se intenta abrir el fichero Ficheros_1.php en modo de slo lectura especificando que, si se puede abrir, el puntero quede al principio del mismo.

    Conviene observar que, al igual que ocurre con las matrices, en los ficheros tambin hay un puntero o apuntador que seala una de las posiciones del fichero.

    Si no se hubiera usado antes la funcin chdir(), sera preciso haber escrito:

    if (fopen("C:\\CursoPHP5\\curso\\Alumnos\\ficheros_del_curso\\fichero1.php", "r"))

    En lugar de poner una estructura de control condicional, tambin es posible utilizar una sintaxis

    4 de 22

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    ms elegante usando la funcin die(), que permite devolver un mensaje al navegador del cliente y da por finalizado el script que se est interpretando. As quedara el cdigo en este caso:

    @fopen("Fichero_1.php","r") or die("El fichero \"Fichero_1.php\" no se ha podido abrir.");

    De esta forma, ms elegante y eficaz, se consigue evitar el mensaje de error que se enva al cliente (por eso hemos usado el operador @) y se dejan de ejecutar las siguientes lneas del cdigo (gracias a la funcin die()). Si el fichero existe y puede abrirse, no se muestra el mensaje y se prosigue con la interpretacin de las siguientes lneas de cdigo.

    Puede verse cmo funciona este cdigo en el Ejemplo 1 de esta Unidad. Como el fichero citado (Fichero_1.php) no existe, hemos comentado estas lneas de cdigo para que puedan seguir ejecutndose las siguientes instrucciones. Si se quiere ver de hecho cmo funciona, el alumno puede copiar el fichero de este ejemplo a su directorio de trabajo y quitar los signos del comentario con el Editor dev-PHP. Si no los vuelve a poner, no se interpretar nunca el resto de las lneas que aparecen en el ejemplo completo.

    La forma ms frecuente de citar el nombre de un fichero y su identificador es usando dos variables, una para que contenga el nombre del fichero y otra para que contenga el identificador del mismo. Mira el siguiente cdigo:

    $fichero1="Ficheros_1.php";$id_fichero1=@fopen($fichero1,"r") or die("El fichero \"Fichero_1.php\" no se ha podido abrir. ");echo "El fichero \"Ficheros_1.php\" existe y ha quedado abierto en modo lectura.";

    En la variable $fichero1 hemos guardado el nombre del fichero; la variable $id_fichero1 contiene el identificador de fichero. Para realizar cualquier operacin con este fichero abierto, debemos utilizar el identificador creado.

    Si se pretende abrir un fichero en modo escritura y no existe, se intenta crear el fichero especificado. Si existe, es preciso tener mucho cuidado con el parmetro mode que se utilice, ya que w y w+ truncan el fichero dejando su tamao a cero y colocando el puntero al principio del fichero. Esto quiere decir que se perder su contenido anterior. En cambio, a y a+ no truncan el fichero y colocan el puntero al final del fichero. Por lo tanto, el contenido nuevo se aadir a lo que ya haba.

    En el Ejemplo 1 pueden verse varias operaciones de este tipo y sus resultados. Conviene abrir con el Bloc de notas o con el Editor dev-PHP los ficheros Ficheros_2.txt (una vez creado) y Ficheros_3.txt despus de realizar cada una de estas operaciones, para ver su contenido y comprender bien cmo funciona cada parmetro mode.

    $fichero2="Ficheros_2.txt";

    $id_fichero2=@fopen($fichero2,"w");

    Con estas dos instrucciones, si el fichero Ficheros_2.txt no exista, se crea con tamao 0; si ya exista y tena contenido, se deja vaco.

    $fichero3="Ficheros_3.txt";

    5 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo1/#sin_cabecerahttp://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo1/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    $id_fichero3=@fopen($fichero3,"a");

    Con estas dos instrucciones, si el fichero Ficheros_3.txt exista, se abre y se deja el puntero al final del mismo, disponible para aadir ms contenidos; si no exista, se crea con tamao 0 tambin disponible para aadir contenidos.

    Cerrar un fichero

    Todo fichero que ha sido abierto debe ser cerrado una vez que se ha acabado de realizar con l las operaciones previstas.

    La funcin fclose() permite cerrar los ficheros abiertos. Su sintaxis es sencilla:

    fclose(nombre de identificador);

    Se cierra slo el fichero del identificador que se especifique. Al ejecutarse esta funcin, se comprueba si el fichero pasado como argumento est abierto y lo ha podido cerrar o no. En el primer caso esta funcin devuelve True; en el segundo (si el fichero no existe o no est abierto), False.

    Desde el Programa gestor del curso puede abrirse el Ejemplo 1 de esta Unidad. El botn Ejecutar muestra en la pgina el resultado de su interpretacin. Con el botn Cod fuente, se accede la cdigo PHP del mismo. En este ejercicio se incluyen los ejemplos cuyo cdigo hemos ido escribiendo junto a las funciones explicadas.

    3 - Recorrer ficheros y leer su contenido

    En este apartado de la Unidad 4 vamos a explicar cmo se recorre un fichero en PHP. Muchas veces es necesario mover el puntero de ficheros a una posicin determinada desde otra previa para leer su contenido o para modificarlo o insertar algn texto. PHP tiene tambin funciones que permiten mover el puntero por el contenido de los ficheros.

    En los ejemplos que acompaan a las explicaciones vamos a utilizar los mismos ficheros con los que hemos trabajado en el apartado anterior y uno nuevor: Ficheros_1.php, Ficheros_2.txt, Ficheros_3.txt y Ficheros_4.txt. Recordamos que stos deben haber sido copiados o creados en el directorio de trabajo del alumno. Adems, este directorio debe especificarse como argumento de la funcin chdir(). Si el alumno o alumna tiene alguna duda sobre este asunto, debe leer la Nota del apartado anterior.

    Recorrer un fichero

    La funcin rewind() sirve para colocar el puntero de acceso a los ficheros en la primera posicin. Ya hemos visto que, cuando se abre un fichero, algunos parmetros de su argumento mode colocan el puntero en la primera posicin, pero, a lo largo de diversas operaciones con el mismo, puede suceder que no sepamos dnde est el puntero. Para colocarlo en la primera posicin, debemos usar rewind(). Para poder realizar esta operacin, lgicamente, el fichero debe estar abierto.

    Su sintaxis es la siguiente:

    rewind("nombre completo del fichero" o identificador);

    6 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo1/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Por ejemplo, la instruccin rewind("Ficheros_1.php"); coloca el puntero de ese fichero en la primera posicin.

    La funcin fseek() se utiliza para mover el puntero tantas posiciones hacia delante (si el segundo argumento es un nmero positivo) o hacia atrs (si es un nmero negativo) como se indique en su segundo argumento. Tiene una sintaxis tambin sencilla:

    fseek("nombre completo del fichero" o identificador, nmero de posiciones que hay que saltar);

    Por ejemplo, la instruccin fseek("Ficheros_1.php",75); coloca el puntero del fichero en el carcter (byte) que ocupa la posicin 75.

    La funcin ftell() se utiliza para conocer en qu posicin del fichero est el puntero. Tiene esta sintaxis:

    ftell("nombre completo del fichero" o identificador);

    Devuelve un nmero entero y se usa cuando se desconoce la posicin del puntero. Suele combinarse con la funcin fseek() para desplazar el puntero de forma relativa.

    Por ejemplo, la instruccin ftell("Ficheros_1.php"); escrita despus de fseek("Ficheros_1.php",75); devuelve el valor 75.

    Si queremos mover el puntero de forma relativa diez posiciones adelante, escribiremos la instruccin

    fseek("Ficheros_1.php",ftell("Ficheros_1.php")+10);

    La funcin feof() se utiliza para detectar si se ha sobrepasado la ltima posicin del fichero, es decir, si se ha alcanzado la marca de final de fichero. Tiene esta sintaxis:

    feof("nombre completo del fichero" o identificador);

    Devuelve el valor lgico True si se ha alcanzado la marca de final de fichero o False si no se ha hecho.

    Por ejemplo, la instruccin feof("Ficheros_1.php"); escrita despus de fseek("Ficheros_1.php",5000); devuelve el valor True, ya que el fichero tiene menos de 5.000 caracteres (bytes) y, por tanto, se encuentra la marca de final de fichero.

    Esta funcin es muy til para leer uno a uno o lnea a lnea todos los caracteres de un fichero usando un bucle while (!feof()), como estudiaremos ms adelante.

    Puede verse cmo se usan las funciones explicadas en el Ejemplo 2 de esta Unidad.

    Leer los contenidos de un fichero

    Hasta ahora slo hemos accedido a un fichero y nos hemos movido por sus caracteres, posiciones o bytes, pero en ningn momento hemos visto o modificado su contenido. Veamos ahora cmo podemos leer un fichero.

    7 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo2/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    La funcin fread() se utiliza para leer una cadena de un fichero abierto. Tiene esta sintaxis:

    fread("nombre completo del fichero" o identificador, nmero de caracteres que se deben leer);

    Si se alcanza la marca de final de fichero (feof()) antes de leer todos los caracteres indicados, se lee hasta el final del mismo, si bien no se produce ningn error al llegar al final de fichero.

    Por ejemplo, la instruccin fread("Ficheros_3.txt",25) devuelve los 25 primeros caracteres de este fichero, pues el puntero despus de abrir el fichero con el parmetro r estaba al comienzo del mismo. Adems, el puntero se desplaza a la posicin 26, por cual una segunda lectura parte desde esta posicin.

    Puede verse el uso de esta funcin en el Ejemplo 2 de esta Unidad.

    La funcin fgets() hace exactamente lo mismo que la funcin fread() y lleva los mismo parmetros como argumentos. Slo se diferencian en que la funcin fgets() slo lee una cadena que, como mximo, abarca hasta que encuentre la marca de final de lnea (retorno de carro). Por ello, si el nmero del segundo parmetro es superior a los caracteres de una lnea, la cadena que se lee comprender slo el texto de la lnea.

    Con esta funcin incluida dentro de un bucle podemos leer lnea a lnea un fichero de esta forma:

    rewind("Ficheros_3.txt");while (!feof("Ficheros_3.txt")){ $linea=fgets("Ficheros_3.txt",256); echo "$linea ";}

    Conviene advertir que, cuando se ejecutan las funciones anteriores, la cadena contiene una posicin menos que la indicada en el argumento, es decir, si ponemos 10 como longitud de la cadena, se muestran 9 caracteres. Esto se debe a los cdigos de salto de lnea, que se leen tambin, aunque no se muestran.

    La funcin fgetss() hace exactamente lo mismo que la funcin fgets(), pero en la lectura prescinde de las etiquetas propias del lenguaje HTML. Su sintaxis es la siguiente:

    fgetss("nombre completo del fichero" o identificador, nmero de caracteres que se deben leer, "etiquetas que pueden leerse");

    El uso de esta funcin tambin puede verse en el Ejemplo 2 de esta Unidad.

    La funcin fgetc() se utiliza para leer un carcter de un fichero abierto a partir de la posicin del puntero. Tiene esta sintaxis:

    fgetc("nombre completo del fichero" o identificador);

    Por ejemplo, la instruccin fgetc("Ficheros_3.txt") devuelve el carcter de este fichero sobre el que est el puntero. ste tambin se desplaza una posicin.

    Usando esta funcin dentro de un bucle que recorra desde la primera posicin hasta la marca

    8 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo2/#sin_cabecerahttp://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo2/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    de final de fichero puede mostrarse el contenido completo de ste.

    Puede verse el uso de esta funcin en el Ejemplo 2 de esta Unidad.

    La funcin file() tambin se usa para leer un fichero y asignar el texto de cada lnea a una matriz. La primera lnea se coloca como elemento 0 y as sucesivamente. En este caso el identificador que se pasa como argumento es el propio nombre del fichero y la funcin count() permite saber cuntos elementos tiene la matriz para poder recorrerla posteriormente. Veamos un ejemplo:

    $matriz=file("Ficheros_3.txt");for ($i=0;$i

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Modificar el contenido de un fichero

    La funcin fputs() sirve para escribir en el fichero especificado una cadena de caracteres del tamao que se indique. Para poder realizar esta operacin, lgicamente, el fichero debe estar abierto. Esta funcin devuelve el valor lgico True si se ha podido realizar la operacin sin problema o False si no se ha podido.

    Su sintaxis es la siguiente:

    fputs("nombre completo del fichero" o identificador, cadena que se escribe,tamao de la cadena);

    El tercer argumento es opcional. Si no se pone, se escribe la cadena completa. Si se indica, slo se escribe el nmero de caracteres sealado.

    Para que esta operacin funcione correctamente es preciso utilizar bien el modo de apertura del fichero. Si ha de aadirse el texto por el principio del fichero, debemos usar el parmetro de apertura r+; si necesitamos aadir el texto por el final, usaremos los parmetros de apertura a o a+; si queremos sustituir el contenido completo del fichero, hay que poner los parmetros de apertura w o w+.

    Por ejemplo, la instruccin fputs("Ficheros_2.php","Nuevo texto"); suponiendo que el fichero se ha abierto con el parmetro r+, aade el texto al principio del fichero indicado sustituyendo los caracteres originales que ste ocupe.

    La funcin fwrite() es idntica a fputs() y su sintaxis lleva los mismos argumentos, que se comportan igual que en la funcin explicada. As pues, puede usarse tambin en lugar de la anterior.

    En el Ejemplo 3 de esta Unidad pueden verse varias operaciones con esta funcin.

    Desde el Programa gestor del curso puede abrirse el Ejemplo 3 de esta Unidad. El botn Ejecutar muestra en la pgina el resultado de su interpretacin. Con el botn Cod fuente se accede al cdigo PHP del mismo. En este ejercicio se incluyen los ejemplos cuyo cdigo hemos ido escribiendo junto a las funciones explicadas y otros nuevos.

    5 - Copiar, borrar y renombrar ficheros. Conocer sus atributos

    En este apartado de la Unidad 4 vamos a explicar otras operaciones que tambin pueden llevarse a cabo en PHP con los ficheros: copiarlos, renombrarlos, borrarlos y conocer sus atributos.

    En los ejemplos que acompaan a las explicaciones vamos a utilizar los mismos ficheros con los que hemos trabajado en los dos apartados anteriores: Ficheros_1.php, Ficheros_2.txt, Ficheros_3.txt y Ficheros_4.txt. Recordamos que stos deben haber sido copiados o creados en el directorio de trabajo del alumno. Adems, este directorio debe especificarse como argumento de la funcin chdir().

    Como en los ejemplos de este apartado tambin se van a realizar operaciones que afectan a la integridad de los ficheros, como borrarlos o renombrarn, aconsejamos comprimir estos cuatro

    10 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo3/#sin_cabecerahttp://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo3/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    ficheros, para que se pueda volver al original siempre que se necesite. En todo caso, procuraremos que en el Ejemplo 4 los ficheros queden al final igual que estaban, para que cualquier alumno o alumna pueda practicar con ellos. Si se tiene alguna duda sobre este asunto, lase la Nota del apartado segundo (Abrir y cerrar ficheros).

    Copiar un fichero

    La funcin copy() sirve para hacer una copia fsica de un fichero en otro. Para poder realizar esta operacin, el fichero original no debe estar abierto. Esta funcin devuelve el valor lgico True si se ha podido realizar la operacin sin problemas o False si no se ha podido.

    Su sintaxis es la siguiente:

    copy("nombre del fichero original", "nombre del fichero destino");

    Por ejemplo, copy("Ficheros_2.txt","Ficheros2_2.txt"); hace una copia exacta del primero en el segundo.

    En el Ejemplo 4 de esta Unidad pueden verse varias operaciones con esta funcin y las siguientes de este apartado.

    Si el fichero destino existe, es sustituido automticamente. Por eso, conviene combinar la funcin copy() con la funcin file_exists(), que detecta si un fichero existe, para no sustituir involuntariamente el contenido de un fichero con el de otro. As se hace en el Ejemplo 4.

    La funcin unlink() sirve para borrar fsicamente un fichero. Para poder realizar esta operacin, el fichero original no debe estar abierto. Esta funcin devuelve el valor lgico True si se ha podido realizar la operacin sin problema o False si no se ha podido.

    Su sintaxis es la siguiente:

    unlink("nombre del fichero que debe borrarse");

    Por ejemplo, la instruccin unlink("Ficheros_2.txt"); elimina el fichero especificado. Si no se ha fijado con chdir() el directorio actual, hay que indicar delante del nombre del fichero el camino completo donde se halla.

    Para evitar errores, conviene combinar la funcin unlink() con la funcin file_exists(), como hemos hecho con la funcin copy().

    La funcin rename() sirve para cambiar el nombre de un fichero. Para poder realizar esta operacin el fichero original no debe estar abierto. Esta funcin devuelve el valor lgico True si se ha podido realizar la operacin sin problemas o False si no se ha podido.

    Su sintaxis es la siguiente:

    rename("nombre del fichero original","nuevo nombre del fichero");

    Por ejemplo, rename("Nuevo.txt","Ficheros_2.txt"); cambia el nombre del fichero original por el nuevo nombre.

    Si ya hay un fichero con el mismo nombre, la operacin no se lleva a cabo. Por eso, conviene

    11 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo4/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    combinar la funcin rename() con la funcin file_exists(), tanto para comprobar que existe el fichero original como para comprobar que no existe otro con el nombre que se le quiere poner. As se hace en el Ejemplo 4.

    Conocer los atributos, el tipo y el tamao de un fichero

    Las tres operaciones que hemos explicado antes slo pueden ejecutarse si el fichero, caso de que exista, tiene el atributo de slo lectura en estado de False. Adems, es preciso saber otras cosas para poder tratar un fichero, como si existe o no, si el nombre indicado es un de un fichero o de un directorio y el tipo de fichero que es. Todo esto lo vamos a ver en este apartado.

    La funcin filesize() devuelve el tamao de un fichero expresado en nmero de bytes.

    La funcin filetype() devuelve el tipo del fichero pasado como argumento. Segn el nombre pasado como argumento, los tipos que puede devolver esta funcin son:

    file: es un fichero normal.

    dir: es un nombre de directorio.

    link: es un enlace simblico (slo en sistema UNIX).

    fifo: es una pila de tipo FIFO.

    char: es en dispositivo de tipo carcter, por ejemplo C:\.

    block: es un dispositivo de bloque.

    unknown: tipo desconocido.

    La funcin is_dir() devuelve True si es un directorio y False si no lo es o no existe.

    La funcin is_executable() devuelve True si es un fichero ejecutable por el cliente que accede al mismo y False si no lo es o no existe.

    La funcin is_file() devuelve True si es un fichero normal y False si no lo es o no existe.

    La funcin is_link() devuelve True si es un enlace simblico y False si no lo es o no existe.

    La funcin is_writable() devuelve True si es un fichero en el que se puede escribir y False si no lo es o no existe.

    La funcin is_readable() devuelve True si es un fichero que se puede leer y False si no lo es o no existe.

    La funcin stat() devuelve una matriz con 13 elementos que contienen informacin sobre el fichero, si existe. Concretamente, se informa de los siguientes aspectos: dispositivo, i-nodo, permisos, nmero de enlace, propietario, grupo, tipo de dispositivo, tamao, instante del ltimo acceso, instante de la ltima modificacin, instante del ltimo cambio, tamao del bloque y nmero de bloques asignados. Como se ve, es una informacin ms bien adecuada para el

    12 de 22

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    administrador de un servidor. Adems, algunas informaciones slo son propias del sistema Linux, por lo que Windows devuelve el valor 1.

    En el Ejemplo 4 de esta Unidad pueden verse varias operaciones con las funciones anteriores.

    Desde el Programa gestor del curso puede abrirse el Ejemplo 4 de esta Unidad. El botn Ejecutar muestra en la pgina el resultado de su interpretacin. Con el botn Cod fuente se accede al cdigo PHP del mismo. En este ejercicio se incluyen los ejemplos cuyo cdigo hemos ido escribiendo junto a las funciones explicadas y otros nuevos.

    6 - Operaciones con directorios

    Hasta ahora slo hemos trabajado con ficheros dando por supuesto que stos se hallan en el directorio C:\cursoPHP5\curso\Alumnos\ficheros_del_curso, que hemos establecido como actual con la funcin chdir().

    Pero PHP permite tratar tambin directorios: crearlos, eliminarlos, fijar alguno por defecto, as como subir ficheros desde el cliente al servidor, usarlos y validarlos, etctera. En este apartado vamos a estudiar estas funciones.

    En los ejemplos que acompaan a las explicaciones vamos a utilizar el mismo directorio C:\cursoPHP5\curso\Alumnos\ficheros_del_curso y los mismos ficheros con los que hemos trabajado en los apartados anteriores: Ficheros_1.php, Ficheros_2.txt, Ficheros_3.txt y Ficheros_4.txt. Para no tocar los directorios y ficheros del Curso de PHP 5 , recordamos que el alumno debe disponer de un directorio de trabajo y que los ficheros mencionados deben haber sido copiados o creados en el mismo.

    Como en los ejemplos de este apartado tambin se van a realizar operaciones que afectan a la integridad de los directorios, como crearlos o borrarlos, conviene trabajar siempre en el propio directorio, como en nuestro caso realizamos siempre las operaciones dentro de C:\cursoPHP5\curso\Alumnos\ficheros_del_curso. En todo caso, procuraremos que en las diferentes operaciones del Ejemplo 5 los directorios queden al final igual que estaban, para que cualquier alumno o alumna pueda practicar con ellos. Si se tiene alguna duda sobre este asunto, lase la Nota del apartado segundo (Abrir y cerrar ficheros).

    Fijar un directorio del servidor por defecto

    Ya hemos estudiado y practicado suficiente con la funcin chdir(), que permite establecer un directorio como actual o por defecto. Nos remitimos a las explicaciones dadas en el apartado Abrir y cerrar ficheros. Una vez fijado este directorio, cualquier referencia a un fichero se buscar aqu, si no se especifica otro camino donde deba hacerse.

    Abrir un directorio

    La funcin opendir() permite entrar en un directorio del servidor y tener acceso a sus ficheros y subdirectorios. Es imprescindible abrir un directorio para, despus, poder cerrarlo con closedir(), leer sus ficheros con readdir() o mover el puntero de lectura de un directorio con rewinddir().

    13 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo4/#sin_cabecerahttp://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo4/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Su sintaxis es la siguiente:

    opendir("camino completo de directorio");

    Esta funcin devuelve un identificador de directorio que nos servir despus para hacer referencia a ese directorio, como ocurre con los ficheros.

    Por ejemplo, opendir("cursoPHP5"); abre este directorio. Para que nos devuelva un identificador que necesitaremos despus, lo mejor es escribir:

    $id_dircurso=opendir("cursoPHP5");

    Adems, como hemos hecho en los ficheros, recomendamos la siguiente estructura, ya usada y explicada en los ficheros:

    $id_dircurso= @opendir("/cursoPHP5/curso/Alumnos/ficheros_del_curso/") or die("El directorio \"/cursoPHP5/curso/Alumnos/ficheros_del_curso/\" no se ha podido abrir.");

    Es importante tener en cuenta que, al escribir el camino, la barra \ debe escribirse doble, si bien recomendamos usar mejor la barra nica /.

    PHP dispone tambin de una clase que nos permite acceder y tratar los directorios. Es la clase dir(). Para abrir un directorio funciona igual que opendir(). Adems, tiene dos propiedades, que son handle (puntero) y path (camino), y tres mtodos, que son read() (leer el nombre de un fichero o subdirectorio), rewind() (llevar el puntero al principio de directorio) y close() (cerrar el directorio). Dentro de esta clase pueden usarse, adems, las funciones estndar de manejo de directorios. En la Unidad anterior se explican las clases, donde el alumno puede repasar estos contenidos, si lo necesita.

    Ver cmo se usa esta clase en el Ejemplo 5.

    Cerrar un directorio

    La funcin closedir() permite cerrar un directorio del servidor. El directorio debe haber sido abierto previamente.

    Su sintaxis es la siguiente:

    closedir("nombre del identificador de directorio");

    Leer un directorio

    La funcin readdir() permite leer los ficheros o directorios del directorio abierto.

    Su sintaxis es la siguiente:

    readdir("nombre del identificador de directorio");

    Esta fncin lee el nombre del fichero o directorio sobre el que est el puntero y avanza ste al siguiente. Lo normal es usar esta funcin dentro de un bucle que vaya leyendo uno a uno los elementos (ficheros o subdirectorios) del directorio.

    14 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo5/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Por ejemplo, podemos recorrer un directorio completo de la forma siguiente:

    $id_dircurso= @opendir("/cursoPHP5/curso/Alumnos/ficheros_del_curso") or die("El directorio\"/cursoPHP5/curso/Alumnos/ficheros_del_curso\" no se ha podido abrir.");

    while ($fichero=readdir($id_dircurso)){ if (is_dir($fichero)) print ("$fichero es un directorio."); else print ("$fichero es un fichero.");}

    La clase dir() tambin permite leer un directorio, como hemos explicado antes.

    Mover el puntero de lectura de un directorio

    La funcin rewinddir() lleva el puntero de lectura de un directorio al principio de ste, para poder leerlo completo si el puntero se haba desplazado anteriormente.

    Su sintaxis tambin es sencilla:

    rewinddir("nombre del identificador de directorio");

    En el Ejemplo 5 de esta Unidad pueden verse varias operaciones con estas funciones y las siguientes de este apartado.

    Crear un directorio

    La funcin mkdir() permite crear un directorio dentro del directorio actual. La sintaxis es sencilla:

    mkdir("nombre del nuevo directorio",entero octal de modo);

    En UNIX hay que poner un segundo parmetro (nmero entero en base octal), que indica el modo o permisos de creacin. No es el caso de este curso. En Windows debemos poner 0 en este parmetro.

    Esta funcin devuelve el valor lgico True si se ha podido realizar la operacin sin problema o False si no se ha podido. Si no hay un directorio establecido como actual, es preciso poner el camino completo del directorio que se quiere crear.

    Por ejemplo, las instrucciones

    $nuevo_dir="Pruebas";

    mkdir($nuevo_dir,0);

    crean el directorio Pruebas dentro de C:\cursoPHP5\curso\Alumnos\ ficheros_del_curso. Con el Explorador de Windows puede comprobarse que realmente se ha creado.

    Si el directorio ya existe, se produce un error. Por eso, al igual que ocurre con los ficheros,

    15 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo5/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    conviene comprobar con la funcin file_exists() si ya existe, para no intentar crearlo en este caso.

    Borrar un directorio

    La funcin rmdir() permite borrar un directorio. Su sintaxis es tambin sencilla:

    rmdir("nombre del directorio que se quiere borrar");

    Esta funcin devuelve el valor lgico True si se ha podido realizar la operacin sin problema o False si no se ha podido. Si no hay un directorio establecido como actual, es preciso poner el camino completo del directorio que se quiere eliminar. Para poder borrarse, el directorio debe existir y estar vaco.

    Por ejemplo, las instrucciones

    $directorio="Pruebas";

    rmdir($nuevo_dir);

    eliminan el directorio Pruebas dentro de "C:\cursoPHP5\curso\Alumnos\ ficheros_del_curso. Con el Explorador de Windows puede comprobarse, igualmente, que realmente se ha eliminado.

    Si el directorio no existe o no est vaco, se produce un error. Por eso, al igual que ocurre con los ficheros, en esta operacin conviene comprobar con la funcin file_exists() si existe, con el signo @ para evitar el mensaje si no existe y con die() para mostrar un mensaje propio si existe, pero no est vaco. sta sera una forma elegante de hacerlo:

    $directorio="Pruebas";

    if (file_exists($directorio)) @rmdir($directorio) or die("El directorio \"Pruebas\" no se ha podido borrar al no estar vaco.");

    Si el problema consiste en que no est vaco, hay que eliminar todos los ficheros con la funcin unlink() antes de intentar borrar el directorio.

    En el Ejemplo 5 de esta Unidad pueden verse varias operaciones con las funciones explicadas

    Subir ficheros al servidor, usarlos y validarlos

    Con PHP el cliente de una pgina web tambin puede subir ficheros al servidor desde su ordenador, es decir, se puede convertir en emisor de informacin.

    La forma ms frecuente de hacerlo es rellenando formularios con la informacin que el website le pida, sea sta personal, profesional o econmica, a fin de conseguir algo, como obtener datos sobre algo que le interesa, comprar algn producto, apuntarse en un servicio, etctera. Los datos que el usuario enva al servidor suelen ser de tipo texto. Cuando se reciben en su destino, se procede con ellos como convenga segn la finalidad de la aplicacin.

    16 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo5/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Pero tambin es posible en PHP enviar ficheros al servidor, en formato texto o binario. Por ejemplo, se puede remitir un fichero con el currculum vitae o una fotografa, etctera.

    Vamos a estudiar los pasos que se dan cuando se sube un fichero al servidor:

    1. Mediante un formulario se pregunta el nombre del fichero. En el Ejemplo 6 de esta Unidad se usa el script uni4_eje6.php para preguntar el fichero que se quiere subir. Explicamos brevemente el cdigo, que est compuesto exclusivamente por etiquetas HTML.

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    $_FILES['fichero']['size']: tamao del fichero que se pasa. $_FILES['fichero'][type']: tipo del fichero que se pasa.

    Pero el fichero temporal permanece slo unos instantes en el directorio temporal del servidor, por lo cual hay que copiarlo al directorio donde queremos que se mantenga.

    3. Copia del fichero desde el directorio temporal hasta el directorio destino. Al llevar a cabo esta operacin es el momento de hacer los controles que creamos oportunos para que no se copie un fichero de cualquier tipo, ni se sustituya otro que tuviera el mismo nombre, ni se sobrepase una determinado tamao, etctera.

    Para copiar el fichero, podemos usar las instrucciones

    $fichero_destino="$directorio".$_FILES['fichero']['name'];

    move_uploaded_file($_FILES['fichero']['tmp_name'], $fichero_destino);

    En cuanto a los controles anteriores a la copia, podemos hacerlos as:

    Para evitar que se copie un fichero de tamao mayor de 50 Kb o que no ha sido elegido en el formulario al enviar la variable $_FILES vaca, podemos escribir:

    if ($_FILES['fichero']['size']>51200 or $_FILES['fichero']['size']

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    7 - Otras operaciones con ficheros y directorios

    Adems de las operaciones mencionadas, con los ficheros y directorios pueden llevarse a cabo otras operaciones, como las que explicamos a continuacin.

    Rellenar una ventana desplegable con los ficheros de un directorio

    Resulta muy cmo seleccionar uno entre varios ficheros si en una etiqueta SELECT de HTML pueden incluirse todos los ficheros del directorio o slo algunos, segn su tipo. En el cdigo siguiente puede verse cmo se hace:

    $directorio=("/cursoPHP5/curso/Alumnos/Ficheros_del_curso/");echo "";$puntero=opendir($directorio);// Avanzamos el puntero hasta el primer// fichero sobrepasando . y ..$fichero=readdir($puntero);$fichero=readdir($puntero);

    while ($fichero){ $fichero=readdir($puntero); if (ereg("$",$fichero))

    /* La funcin ereg() permite buscar cadenas coincidentes. Pertenece a las funciones para expresiones regulares, como eregi() y split(), entre otras. */

    echo "$fichero";}echo "";

    Puede verse cmo se lleva acabo esta operacin en el Ejemplo 7 de esta Unidad. En el mismo aparecen los parmetros que deben ponerse en la funcin ereg() para que slo se muestren los ficheros de tipo php o txt.

    Transformar un fichero HTML en otro de tipo texto

    Al estudiar la funcin fgetss() ya vimos que esta funcin lee un fichero y, si es de tipo HTML, elimina las etiquetas propias de este lenguaje. Veamos cmo se lleva a cabo esta operacin:

    $origen_html=fopen("uni4_eje7_fichero.html","r");$destino_txt=fopen("uni4_eje7_fichero.txt","w") or die ("No se puede crear el fichero destino.");

    while (!feof($origen_html)){ $linea=fgetss($origen_html,256,""); echo "$linea "; fputs($destino_txt,trim($linea)."\n");}

    A veces, puede resultar til esta rutina cuando se necesita disponer de un fichero en cuyo contenido se hayan eliminado las etiquetas HTML y convertido el fichero en otro nuevo de tipo texto.

    19 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo7/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Desde el Programa gestor del curso pueden abrirse el Ejemplo 7 de esta Unidad. El botn Ejecutar muestra en la pgina el resultado de su interpretacin. Con el botn Cod fuente se accede al cdigo PHP de los mismos. En este ejercicio se incluyen los ejemplos cuyo cdigo hemos ido escribiendo junto a las funciones explicadas en este apartado.

    Permisos y propietarios

    Cuando se trabaja en una plataforma UNIX, cosa habitual en Internet, PHP dispone de un conjunto de funciones que permiten gestionar los permisos y propietarios de los ficheros y de los directorios. Como este curso ha sido creado para Windows, recomendamos al alumno o alumna que use PHP con Unix/Linux que estudie y aprenda a usar las funciones siguientes:

    chgrp(): permite cambiar el grupo al que pertenece un fichero.

    chmod(): permite cambiar los permisos de un fichero.

    chwon(): permite cambiar el propietario de un fichero.

    filegroup(): devuelve el identificador de un grupo.

    fileowner: devuelve el identificador del usuario de un fichero.

    fileperms(): devuelve los permisos de un fichero.

    8 - Resumen

    Hay que saber al final de esta unidad

    Establecer un directorio por defecto con chdir().

    Abrir un fichero con fopen() o con dir(), poniendo controles con die() y con file_exists() por si el fichero no existe o la operacin con se puede realizar.

    Usar el operador @ y aplicar correctamente los diversos modos de abrir un fichero, tanto de lectura como de escritura.

    Cerrar un fichero con fclose(). Recorrer un fichero moviendo el puntero con fread() y con rewind().

    Mover el puntero de un fichero con fseek(). Localizar la posicin del puntero con ftell().

    20 de 22

    http://localhost/curso_ini/index.php?directorio=capitulos/06unidad4/ejemplos/ejemplo7/#sin_cabecera

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Conocer si el puntero ha llegado a la marca de final de fichero con feof().

    Leer el contenido de un fichero con feread(), fgets(), fgetc() y fgetss().

    Leer un fichero lnea a lnea con file() y saber cuntas lneas tiene con count().

    Leer el contenido de un fichero completo con readfile() y fpassthru().

    Escribir en un fichero con fputs() y fwrite() sabiendo aplicar en cada caso los diferentes modos de apertura.

    Copiar ficheros con copy() combinada con file_exists().

    Borrar ficheros con unlink().

    Renombrar ficheros con rename().

    Conocer el tamao de un fichero con filesize(), su tipo con filetype() y sus atributos con is_dir(), is_executable(), is_file(), is_link(), is_writable() y is_readable().

    Conocer la informacin sobre un fichero que se genera con la funcin stat() y se guarda en una matriz.

    Abrir un directorio con la funcin opendir() y la clase dir().

    Conocer y saber usar correctamente las propiedades y mtodos de la clase dir().

    Cerrar un directorio con closedir().

    Leer los ficheros o subdirectorios de un directorio con readdir() o con la clase dir().

    Mover el puntero de lectura de un directorio con rewinddir().

    Crear un directorio con mkdir().

    Borrar un directorio con rmdir().

    21 de 22

  • Curso de PHP 5 Unidad 4 Funciones de acceso a ficheros

    Subir ficheros al servidor, usarlos y validarlos.

    Rellenar una ventana desplegable (SELECT de HTML) con los ficheros de un directorio.

    Transformar un fichero HTML en otro de tipo texto.

    MENTOR - CNICE MEC 2006

    22 de 22

    1 - Objetivos2 - Abrir y cerrar ficheros3 - Recorrer ficheros y leer su contenido4 - Modificar el contenido de los ficheros5 - Copiar, borrar y renombrar ficheros. Conocer sus atributos6 - Operaciones con directorios7 - Otras operaciones con ficheros y directorios8 - Resumen