Está en la página 1de 8

Ficheros y Directorios

Ficheros: introduccin Las operaciones de manipulacin de ficheros tienen una gran importancia en prcticamente todos los lenguajes de programacin, ya que, generalmente, no tiene sentido una aplicacin que no sea capaz de mostrar resultados en pantalla, leer o escribir en un fichero o manipular una base de datos. A lo largo del mdulo se analizar la forma de acceder a datos almacenados en ficheros y directorios, y las diferentes formas de trabajo con dichos elementos. Las operaciones sobre ficheros suelen constar de tres fases:

Fase 1: Apertura del fichero En esta primera fase se abre el fichero, indicando si se realizarn operaciones para leer, escribir o aadir al final del mismo. La operacin devuelve un descriptor de fichero.

Fase 2: Procesamiento del fichero Dentro de esta fase se distinguen dos posibilidades, que se hubiera abierto para lectura o para escritura.

Fase 3: Cierre del fichero Una vez realizadas las correspondientes operaciones sobre el fichero, se debe proceder a su cierre.

Fase 1: Apertura del fichero La operacin de apertura del fichero se realiza con la funcin fopen(), cuya sintaxis es:
Descriptor= fopen(string fichero, string modo[, int incluye_path])

Donde: Descriptor r Es un nombre comenzando con el smbolo $ (de nomenclatura similar a las variables). nombre_fichero: representa un string con el nombre del fichero y la ruta incluida (tambin puede ser una variable de tipo String). modo_apertura es otro string con el tipo de apertura deseado. La funcin devuelve un identificador de recurso (false si la operacin no pudo realizarse correctamente), y los parmetros representan: fichero Nombre del fichero a abrir. Por ejemplo, " datos.txt" Los modos ms habituales son: r Lectura: para leer datos desde el fichero r+ Lectura/Escritura. El puntero se coloca al inicio del fichero. Escritura: para escribir datos desde el inicio del fichero (el contenido anterior, si existe, desaparece) Lectura/Escritura. Si no existe se crea. Si ya existe, se borra todo w+ contenido quedando a w

modo

Aadir al final: para aadir datos al final del fichero (el contenido anterior, si existe, se mantiene) Lectura/Escritura(aadir). Si no existe se crea. Si ya existe el puntero a+ se pone al final para aadir datos. incluye_path Parmetro opcional. Indica si el fichero debe buscarse en el path a Hay que tener tantos descritores como ficheros abiertos deseemos tener simultanemanete. En el caso de que el fichero no se haya podido abrir, fopen( ) devuelve FALSE. Algunos ejemplos de apertura de ficheros: funcin fopen()
// Apertura para lectura $fichero = fopen("datos.txt", 'r'); // Apertura para escritura silenciando errores con el operador @ $fichero = @fopen("datos.txt", 'w'); // Apertura para aadir, silenciando y buscando en el path $fichero = @fopen("datos.txt", 'a', true);

Una vez realizada la operacin de apertura, y antes de realizar cualquier tipo de procesamiento, se debe verificar que la operacin fopen() ha tenido xito, comprobando si el recurso devuelto se evala como verdadero (la operacin se ha realizado correctamente) o como falso (se ha producido un error al intentar abrir el fichero). Un ejemplo de esta comprobacin podra ser:
// Apertura para lectura silenciando errores con el operador @ $fichero = @fopen("/datos/datos.txt", 'r'); // Si no se ha podido abrir el fichero finaliza la ejecucin del // script devolviendo un mensaje de error if (!$fichero) or die("ERROR: no se ha podido abrir el fichero de datos"); // En caso contrario el script contina ejecutndose ...

En el ejemplo se ha empleado la funcin die(), que provoca la finalizacin de la ejecucin del script mostrando el mensaje recibido como parmetro. Fase 2: Procesamiento del fichero Dentro de esta segunda fase se distinguen dos posibilidades, que se hubiera abierto para lectura o para escritura. Las funciones que suelen emplearse ms habitualmente son: Modo Funcin utilizada
string fgets(resource fichero[, int longitud])

r Lee de fichero el nmero de caracteres indicado en el parmetro longitud, o (ficheros de texto) hasta un carcter de fin de lnea (que es includo), o hasta fin de fichero r
string fread(resource fichero, int longitud)

(ficheros binarios) Lee de fichero el nmero de bytes indicado en el parmetro longitud (o hasta fin de fichero) NOTA: en sistemas Windows el fichero debe abrirse en modo 'rb'
int fwrite(resource fichero, string cadena[, int longitud])

wa

Escribe en fichero los caracteres proporcionados en el parmetro cadena. Si se aade el parmetro longitud, escribe hasta que termine la cadena o hasta que se alcancen los caracteres indicados en este ltimo parmetro, lo que antes ocurra. Devuelve el nmero de caracteres escrito

Fase 3: Cierre del fichero Para cerrar el fichero, simplemente se precisa la funcin fclose(), indicndole el recurso que apunta al fichero. Devuelve true si la operacin tiene xito, false en caso contrario. La sintaxis de la funcin es:
bool fclose(resource fichero)

1.- FUNCIN DE CONTROL DE FINAL DE FICHERO:


Esta funcin devolver TRUE cuando se alcance el final del fichero. feof(descriptor); Es tpica esta construccin en el procesamiento de los datos de un fichero: while (!feof(descriptor)) { . . . operaciones . . . }

2.- FUNCIONES DE LECTURA DESDE UN FICHERO:


Existen diferentes formas de lectura del fichero dependiendo del tipo de dato que contenga este (texto, binario, registro, etc).

1. Lectura Carcter a Carcter:


fgetc(descriptor) Se puede usar con archivos en modo lectura, o lectura-escritura. Devuelve un carcter del fichero referenciado, comenzado desde el primero o desde la posicin actual. Cada vez que ejecuta el puntero interno del fichero avanza una posicin. Cuando se alcanza al final del fichero devuelve FALSE. Se suele usar en bucles de esta forma: $puntero=fopen(. . . .); while ($caracter = fgetc($puntero)) { .... }

2.-Lectura de ficheros de texto por lneas:


fgets(descriptor, [caracteres_a _leeer]); Se usa con ficheros de tipo texto, donde cada lnea termina con un retorno de carro. Lee del fichero el nmero de caracteres indicado en el parmetro longitud, o hasta un carcter de fin de lnea (que es includo), o hasta fin de fichero Si se produce algn error devuelve FALSE. Su uso ms habitual es de la siguiente forma: $puntero=fopen(. . . .) while (!feof($puntero)) { $dato = fgets($puntero); ..... } Existe la funcin fgetss idntica a la anterior pero elimina todos los tags HTML que encuentre. 3.- Lectura de ficheros binarios: fread(descriptor, caracteres_a _leer); Se utiliza para cualquier tipo de ficheros, ya que lee todos sus bytes. Devuelve una cadena con el n de bytes indicado en el parmetro longitud (o hasta fin de fichero) NOTA: en sistemas Windows el fichero debe abrirse en modo 'rb' $puntero=fopen(. . . .) .... $valor = fread($puntero, 1024);

3.- FUNCIONES DE ESCRITURA EN UN FICHERO:


1.- Escritura en modo lneas de texto: fputs(descriptor, cadena, [total_caracteres]); fwrite(descriptor, cadena, [total_bytes]); 2.- Escritura para modo binario: Ambas funciones escriben la cadena pasada como parmetro. Si se aade el parmetro total_caracteres, escribe hasta que termine la cadena o hasta que se alcancen los caracteres indicados en este ltimo parmetro, lo que antes ocurra. La escritura tendr lugar sobrescribiendo el contenido o aadindolo al final, segn el modo de apertura usando con fopen. Ambas devuelven el total de caracteres escrito o FALSE si se ha producido un error. Si se desean grabar lneas de texto con fputs, los saltos de lnea y retornos de carro no son incluidos automticamente, se deben aadir manualmente con un \n para sistemas Linux y un \r\n para sistemas Windows.

Spuntero = fopen(. . . . ); ... $linea=Jose Angel; fputs($puntero, $linea . "\n"); El uso de los salto de lnea tiene sentido cuando se van a efectuar lecturas posteriores con fgets.

3.- Funciones de posicionamiento del puntero del fichero:


1.- Posicionar el puntero al principio del fichero: rewind(descriptor); El puntero se sita al principio del fichero. Ejemplo: rewind($fichero); 2.- Desplazar el puntero a una posicin determinada: fseek (descriptor, desplazamiento, [desde_donde]); Mueve el puntero en tantas posiciones como se haya indicado en desplazamiento. El tercer parmetro es opcional y es una de estas 3 constantes: SEEK_SET Desplazamiento absoluto desde el principio del fichero (por defecto). SEEK_CUR Desplazamiento desde la posicin actual del puntero. SEEK_END Desplazamiento desde el final de fichero (hacia atrs). Ejemplos: fseek($fichero, 0, SEEK_END); fseek($fichero, 50, SEEK_SET); fseek($fichero, 100, SEEK_CUR); ftell(descriptor); // Se posiciona al final // Avanza 50 desde el comienzo // Avanza 100 desde la p. actual

3.- Conocer la posicin actual del puntero interno:

4.-FUNCIONES DE VACIADO DE BUFFER:


fflush(descriptor) La mayora de los SGDF realizan un tratamiento de ficheros denominado con buffer, de forma que las sucesivas operaciones de grabacin no se hacen directamente sobre el dispositivo, sino en memoria y cuando se llena este buffer se produce el volcado fsico, esto tiene que ver con la eficiencia de los dispositivos (no arranques ni paradas innecesarios). Con esta funcin obliga a vaciar este buffer de forma que se produzca la escritura fsica de los datos almacenados en la cach en el dispositivo sealado por el descriptor. El buffer no solo se usa con operaciones de escritura, tambin para la de lectura.

5.- FUNCIONES DE PROCESAMIENTO DE DATOS DE UN FICHERO A NIVEL EXTERNO:


Lectura completa de un fichero: file (Nombre_fichero); Lee todo el contenido de un fichero referenciado por el string nombre_fichero y lo devuelve en forma de array, cada elemento del array ser una lnea. readfile(nombre_fichero); Lee todo el contenido de un fichero referenciado por el string nombre_fichero y lo muestra por la salida Standard, devuelve el n de caracteres ledos. Estas dos funciones no necesitan que el fichero este abierto, ni el descriptor. Es ms se producir un error si se hace un intento de uso con un fichero abierto.

6.- FUNCIONES DE INFORMACIN SOBRE FICHEROS (A NIVEL EXTERNO):


Las siguientes funciones muestran informacin sobre ficheros, son las propiedades de estos desde el punto de vista del Sistema Operativo. Se trata de un pequeo resumen con las principales (hay muchas ms), hay que tener en cuenta las matizaciones necesarias en funcin de la plataforma (UNIX, Windows). file_exist(nombre_fichero); Devuelve TRUE si el fichero exite, se suele usar antes de intentar abrirlo como comprobacin. is_file(nombre_fichero); is_dir(nombre_fichero); is_executable(nombre_fichero); Devuelve TRUE si se trata de un fichero normal. Devuelve TRUE si se trata de un fichero directorio. Devuelve TRUE si se trata de un fichero con permisos de ejecucin (UNIX) o un EXE, COM o BAT de Windows. is_readable(nombre_fichero); is_writeable(nombre_fichero); filetime(nombre_fichero) filesize(nombre_fichero) Devuelve TRUE si tiene permiso de lectura. Devuelve TRUE si tiene permiso de escritura. Devuelve la fecha de la ltima modificacin. Devuelve el tamao del fichero en bytes, o FALSE si hay algn error.

7.- FUNCIONES DE MANTENIMIENTO (COPIA, RENOMBRADO Y BORRADO) DE FICHEROS: copy (origen, destino) Copia ficheros, si no hay error devuelve TRUE. Los dos parmetros deben representar el nombre antiguo y el nuevo con sus rutas correspondientes. rename (nombre_antiguo, nombre_nuevo); Trata de renombra un fichero o directorio devuelve TRUE en caso de xito. En el caso de que se indiquen rutas distintas se proceder a mover el fichero. unlink(nombre_fichero); Borra un fichero. Devuelve TRUE si la operacin se efectu con xito. move_uploaded_file(nombre_fichero, destino) Sirve para mover un archivo cargado, mediante el mecanismo POST del HTTP (Etiqueta Input type=fileupload de los formularios HTML). Devuelve FALSE si ocurre cualquier tipo de error. (* Ver tema posterior). 8.- FUNCIONES DE MANTENIMIENTO (CREAR, CAMBIAR, BORRAR) DE DIRECTORIOS: En todas las funciones, el nombre_directorio es un string. mkdir (nombre_directorio, [permisos]); Crea un directorio con los permisos indicados. Devuelve FALSE si no se ha podido crear. Los permisos hay que ponerlos en modo octal asi que se debe poner un 0 delante. Por ejemplo 0700. rmdir(nombre_directorio); Remueve un directorio. El directorio debe estar vaco y tener los permisos adecuados. Si no es posible devuelve FALSE. chdir(nombre_directorio); Cambia de directorio. 9.- MANEJO DE DIRECTORIOS EN PHP: Para poder operaciones sobre la totalidad de elementos de un directorio, PHP dispone de un sistema similar al de la apertura de archivos. Hay que crear un manejador o descriptor de directorios que representa una conexin lgica con el directorio indicado: descriptor = opendir(ruta del directorio) Ejemplo $midir = opendir("/ejemplos/casa") Una vez establecido este manejador disponemos de las siguientes funciones: readdir(manejador); Devuelve una cadena con un elemento del directorio cada vez que se le invoca. Tambin se incluyen los nombres de directorio actual (.) y del directorio padre ( . . ). Cuando no existan ms elementos o en caso de error, esta funcin devuelve FALSE.

rewinddir(manejador); Sirve para volver a procesar (rebobinar) un directorio desde su primera entrada. Esta funcin no devuelve ningn valor. closedir(manejador); Sirve para liberar el manejador, una vez que se ha terminado el trabajo con los directorios. 9.1.- Ejemplo de uso de funciones de manejo de directorios: <?php $midir= opendir("."); // El punto significa directorio actual. echo "Elementos del directrio actual <BR> "; rewinddir($midir); // No es necesario en este caso while ($elemento = readdir($midir) ) { echo "$elemento <BR>\n"; } closedir($midir); ?> Hay que tener cuidado con la sintaxis, por ejemplo para el directorio raiz de la unidad C en Windows sera necesario escapar la barra $midir= opendir("C:\\"); php0205.php

También podría gustarte