El
sistema de ficheros que incorpora Tcl deriva directamente del sistema operativo UNIX; por ello alguno de sus comandos pueden no funcionar bajo Windows, o funcionarán con limitaciones. A pesar de ello, la mayoría de estos comandos son utilizables bajo Windows sin ninguna limitación.Es recomendable, antes de emplear alguno de estos comandos, comprobar su funcionamiento en la consola de Tk.
El comando file
El comando file provee una serie de métodos para chequear el estado de los ficheros. En la siguiente lista se exponen algunos de ellos, cuyo funcionamiento ha sido comprobado bajo Windows.
|
file executable nombre |
Devuelve 1 si es nombre tiene permiso de ejecución. |
|
file exists nombre |
Devuelve 1 si existe nombre. |
|
file extension nombre |
Devuelve la extensión del fichero. |
|
file isdirectory nombre |
Devuelve 1 si nombre es un directorio. |
|
file isfile nombre |
Devuelve 1 si nombre es un fichero. |
|
file size nombre |
Devuelve el número de bytes de nombre. |
|
file tail nombre |
Devuelve todos los caracteres después del último. |
|
file type nombre |
Devuelve el tipo: file. directory characterSpecial, blockSpecial, fifo, link o socket. |
Entrada/Salida
La siguiente tabla es una lista de comandos asociados a la entrada y salida de datos en ficheros.
|
open fichero ?acceso? ?permiso? |
Abre un fichero. |
|
puts ?-nonewline? ?fichero? cadena |
Escribe una cadena en un fichero. |
|
gets fichero ?nombre_var? |
Lee una línea. |
|
read ?nonewline? fichero ?num_bytes |
Lee un número de bytes. |
|
tell fichero |
Informa de la posición del cursor en el fichero. |
|
seek fichero offset ?origen? |
Coloca el cursor en una posición determinada dentro del fichero. |
|
eof fichero |
Indica el fin del fichero. |
|
close fichero |
Cierra un fichero abierto para I/O. |
Abrir ficheros para I/O
El comando open abre un fichero para entrada/salida de datos (I/O). Su sintaxis es la siguiente:
open fichero ?acceso? ?permisos?
El primer argumento es el nombre del fichero a abrir; el segundo es el acceso a dicho fichero. Este acceso puede tomar dos formas: una secuencia corta de caracteres (similar a la usada por el comando fopen de C/C++) o una lista de flags POSIX. En la tablas 8-3 y 8-4 pueden verse estos valores. El tercero es el valor usado por los bits de permiso cuando se crea un nuevo fichero. este permiso por defecto, es 0666.
|
r |
Abre para lectura. el fichero debe existir. |
|
r+ |
Abre para lectura y escritura. el fichero debe existir. |
|
w |
Abre para escritura. Lo crea si no existe. Si existe lo sobreescribe. |
|
w+ |
Abre para lectura o escritura. Lo crea si no existe. Si existe lo sobreescribe. |
|
a |
Abre para escritura. El fichero debe existir. Los datos son añadidos. |
|
a+ |
Abre para lectura y escritura. El fiichero debe existir. Los datos son añadidos. |
|
RDONLY |
Lo abre para lectura. |
|
WRONLY |
Lo abre para escritura. |
|
RDWR |
Lo abre para escritura y lectura. |
|
APPEND |
Lo abre para añadir. |
|
CREAT |
Crea el fichero si no existe. |
|
TRUNC |
Trunca el fichero si existe (lo sobreescribe). |
Este ejemplo abre el fichero para lectura y escritura, creándolo si es necesario y no truncándolo.
Lectura y escritura
Una vez abierto el fichero, se puede proceder a las operaciones de lectura y escritura. Para ello se cuenta con una serie de comandos que ya fueron presentados en la tabla 8-2: Por otro lado, al igual que en otros lenguajes, existen una serie de ficheros standard del sistema como stdin, stdou o stderr, que pueden ser usados para las operaciones de entrada y salida.
Puts y gets
El comando puts escribe una cadena en una nueva línea del fichero de salida. Toma un argumento denominado -nonewline, que evita que aparezca un carácter de fin de línea al final de la cadena.
El comando gets lee una línea del fichero especificado. Puede ser usado con el comando eof para determinar si se llegó al final del fichero. Dos formas de leer un fichero pueden ser estas:
En este caso, la línea leída por el comando gets se guarda en la variable linea.
Otra forma sería esta:
read
El comando read se utiliza para leer bloques de datos, que puede ser más eficiente que leer líneas. Puede tener dos argumentos diferentes, el número de bytes a leer, o -nonewline, pero no los dos a la vez.
Acceso aleatorio
Los comandos tell y seek son usados para el acceso aleatorio. Cada fichero abierto posee una variable apuntando a una posición determinada de sus datos, posición donde se va a leer o escribir datos; es el llamado seek offset. Cada operación de lectura o escritura actualiza este seek offset con el número de bytes leidos o escritos. La posición actual del offset es devuelta por el comando tell. El comando seek es usado para desplazar este offset a la posición deseada. Esta cantidad a desplazar puede ser tanto positiva como negativa, medida desde un origen que puede ser start (desde el inicio), current (desde la posición actual), o end (desde el final del fichero).
close
el comando close permite cerrar un fichero que hubiera sido abierto para operaciones de lectura o escritura. Si se olvida cerrar un fichero, éste puede ser cerrado cuando el proceso termine. Pero si se está corriendo un programa de gran tamaño, pueden consumirse muchos recursos si se mantiene abiertos ficheros innecesariamente.
cd y pwd
Estos dos comandos son dos instrucciones propias del sistema operativo UNIX, pero heredadas, como otras muchas cosas, por el sistema de ficheros de Tcl. El comando cd permite la navegación por los diferentes directorios (carpetas en Windows 95) del sistema. El comando pwd devuelve el path completo del directorio donde se encuentre el intérprete, si anteriormente no se ha desplazado con el copmando cd. Es importante darse cuenta de que el comando pwd no devuelve el path de la aplicación, sino el del intérprte que no tienen porqué coincidir.
Filtrando nombres con glob
El comando glob permite el conocer los ficheros y subdirectorios de un directorio, mediante la utilización de los caracteres comodines "*" e "?". Su sintaxis es :
glob ?flags? patron ?patron? ...
Así, para conocer el nombre de todos los ficheros y subdirectorios de un directorio, se escribiría:
glob *