Ficheros en Visual Basic
Ficheros en Visual Basic
Ficheros en Visual Basic
1 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
Este libro, Visual Basic - Gua del Estudiante se ofrece a todos los
estudiantes de habla hispana como texto de libre difusin para fines
educativos. Prohibida la copia total o parcial con fines comerciales.
Madrid, Julio de 1998
Autor : Luis Surez Bernaldo
Ingeniero de Telecomunicacin
FICHEROS EN VISUAL BASIC
Existen tres tipos de ficheros donde podremos almacenar y leer datos:
- Secuenciales
- Aleatorios (Random)
- Binarios
Cada uno de ellos tiene sus aplicaciones y particularidades.
FICHEROS SECUENCIALES
Este tipo de ficheros nos permite guardar informacin de cualquier longitud. En este tipo de ficheros, la informacin se
guarda colocando un carcter tras otro. La forma de leerlos es, igualmente, carcter tras carcter. (Byte tras byte).
Son los mas sencillos de manejar, y los utilizados para guardar texto en ASCII. Permiten guardar datos en un fichero
con un determinado nombre, "machacando" la informacin de otro posible fichero que ya estuviese en el disco con el
mismo nombre, o aadir la informacin nueva a continuacin de la ya existente.
Para abrir un fichero secuencial para guardar informacin, debemos ejecutar la siguiente instruccin:
Open Nombrefichero For Output As # Numerocanal
De esta forma, si ya exista un fichero llamado Nombrefichero, sobreescribiremos dicho fichero perdiendo la informacin
que contuviese. Es la forma tpica de hacerlo cuando modificamos un texto. Para aadir la nueva informacin tras la ya
existente, deberemos abrirlo con la siguiente instruccin:
Open Nombrefichero For Append As # Numerocanal
Numerocanal debe ser un nmero comprendido entre 1 y 255. Representa el nmero del canal por donde
introduciremos los datos. Normalmente se llama tambin nmero de archivo. No puede haber mas de un archivo
abierto con un nmero de archivo determinado.
Para cerrar un fichero secuencial, basta con ejecutar la instruccin:
Close # Numerocanal
Si no se especifica Numerocanal (la instruccin Close a secas) se cerrarn todos los ficheros abiertos actualmente.
Para introducir la informacin, pueden emplearse dos mtodos: Print y Write
Print
Introduce la informacin de forma secuencial, byte tras byte tal como se coment. Sirve para guardar
textos. Por ejemplo si deseamos guardar en ese fichero el contenido de una caja de texto llamada
Text1, basta con ejecutar la siguiente instruccin:
Print #1, Text1.Text
El texto queda en el fichero en caracteres ASCII, que se pueden leer con el Type de MS-DOS o
mediante el Bloc de Notas de Windows.
2 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
Cuando los datos se han introducido con la instruccin Print, es decir, cuando hemos introducido texto letra tras letra, la
forma de acceder a ese texto es muy sencilla:
Se abre el archivo con la instruccin Open
Open Nombrefichero For Input As # Numerodecanal
Se utiliza la instruccin Input o Line Input para sacar los datos del fichero.
La instruccin Input tiene en este caso la siguiente sintaxis:
Input (Numero de caracteres, # Numero de canal)
Por ejemplo, Input (1, #1) extrae un carcter del fichero abierto como #1. El nmero mximo de caracteres a extraer
de un golpe mediante la instruccin Input est limitado a 65.534.
Ver un poco mas adelante la propiedad LOF de los ficheros secuenciales. LOF devuelve un valor igual a la longitud
total del fichero. Si ejecutamos la instruccin :
Input (LOF(1), #1)
leeremos el fichero de una nica vez. Este procedimiento puede ahorrarle cierto tiempo a la hora de la lectura. (Por lo
dicho anteriormente, este procedimiento de leer todo el fichero de un golpe solamente se podr hacer si la longitud del
fichero (LOF(1)) es inferior a 65.534 bytes. Tenga esto presente cuando vaya a leer un fichero que no sabe que longitud
tiene. Para curarse en salud, le recomiendo que lea los ficheros secuenciales carcter a carcter. Input(1,#X) pues
tarda poco mas que leyndolo de un golpe.
Slo se utilizar la instruccin Input con archivos abiertos en modo Input o Binary. (Se vern a continuacin) A
diferencia de la instruccin Input #, (la veremos a continuacin, pues es la instruccin que deber utilizar para leer
archivos escritos con la instruccin Write ), Input devuelve todos los caracteres que lee, incluyendo puntos y coma,
retornos de carro, avances de lnea, comillas y espacios iniciales.
Existe una instruccin, Input$ , que asume que el dato a leer es un String. (Cadena de caracteres). Puede ahorrar un
poco de memoria usando esta instruccin en lugar de Input.
Nota Se proporciona otra funcin (InputB) para su uso con datos de byte incluidos en archivos de texto. En lugar de
especificar el nmero de caracteres a devolver, nmero especifica el nmero de bytes.
INSTRUCCION LINE INPUT
La instruccin Line Input se utiliza para extraer una lnea completa. Tiene la siguiente sintaxis:
Line Input # Nmero de canal, Variable
Mediante esta instruccin se extrae una lnea completa (los caracteres delimitados entre dos retornos de carro), y se le
asigna esa cadena a Variable
La instruccin Line Input # lee un carcter cada vez en un archivo hasta que encuentra un retorno de carro (Chr(13)) o
una secuencia retorno de carro-continuacin de lnea (Chr(13) + Chr(10)). Las secuencias de retorno de carrocontinuacin de lnea no se tienen en cuenta y no se aaden a la cadena de caracteres. Cuando lea un archivo mediante
Line Input # y lo quiere presentar en un TextBox o en el Printer, deber introducirlos para evitar que le salga todo el
texto en una nica lnea.
Con lo que se ha explicado, ya puede realizar un pequeo edito de textos. Este sencillo editor tiene un TextBox llamado
TBTexto, donde podemos escribir el texto que queramos (con la propiedad MultiLine = True y ScrollBars = Vertical),
tres botones llamados BAbrir (1), (2 a y b) y (3), para abrir el fichero y poner su contenido en TBTexto, y dos
BGuardar para guardar, uno abriendo el fichero For Append y el otro abrindolo For Output. En este ltimo, al guardar
el texto borramos el contenido que del fichero, si ya existiera. En el primero, lo anexamos al final del mismo . Para
conocer el nombre del fichero, ponemos un CommonDialog llamado CD1, con un filtro CD1.Filter = Ficheros de Texto
3 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
|*.txt
Para abrir el fichero, y depositar su contenido en TBTexto pondremos este cdigo en BAbrir :
Private Sub BAbrir1_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
VarTexto = Input(LOF(1), #1)
'leemos todo el fichero de un golpe
Close #1
TBTexto = VarTexto
End Sub
Cuando el fichero es mayor de 64 kilobytes, el leerlo de un golpe puede dar problemas. Mejor dicho, no funciona.
Deberemos leerlo en ese caso, carcter a carcter o lnea a lnea.
Para leer carcter a carcter :
Private Sub BAbrir_Click()
Dim VarTexto As String
CD1.Filter = "Ficheros de Texto |*.txt"
CD1.ShowOpen
Open CD1.filename For Input As #1
Do Until EOF(1)
Hacemos un bucle de lectura hasta que encontremos EOF(1)
Vea mas adelante la Propiedad EOF en Propiedades de los ficheros Secuenciales
VarTexto = Input(1, #1)
'leemos el fichero carcter a carcter
TBTexto = TBTexto & VarTexto
'vamos aadiendo los caracteres ledos a TBTexto
Loop
Close #1
End Sub
(NOTA.- Lo expuesto funciona perfectamente, pero el hecho de meter en un TextBox carcter a carcter eterniza la
aplicacin. - Meter un texto en un TextBox o en un Label es una operacin que tarda cierto tiempo. Si esa operacin hay
que hacerla una vez por carcter, puede tardar mucho tiempo. Para evitar esto, cuando vaya a leer un fichero carcter
a carcter, mtalo primero en una variable y luego realice un volcado nico de esa variable al TextBox o Label)
Y podemos hacerlo tambin leyendo lnea a lnea con Line Input
4 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
Estas expresiones se usan en un bucle, para ir extrayendo con la instruccin Input o Line Input los caracteres
de un fichero hasta que se encuentre la marca de final de fichero (EOF)
LOC
Devuelve la posicin de lectura/escritura actual en un archivo abierto.
La sintaxis de esta propiedad es: LOC (Numero de canal)
la informacin devuelta para un archivo secuencial es la posicin de byte actual en el archivo, dividida por 128.
LOF
Devuelve la longitud de un fichero (Lenght Of File) abierto mediante Open.
Sintaxis
LOF(numeroarchivo)
Seek(nmeroArchivo)
Observaciones
Seek devuelve un valor entre 1 y 2,147,483,647 (equivalente a 2^31-1) inclusive. Para archivos abiertos en modo
Output, Append o Input, Seek devuelve la posicin de byte en la que se va a ejecutar la siguiente operacin. El primer
byte de un archivo est en la posicin 1, el segundo en la posicin 2 y as sucesivamente.
5 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
Dir[(nombreruta[, atributos])]
nombreruta
Expresin de cadena que especifica un nombre de archivo. Puede incluir el directorio o carpeta y la
unidad de disco. Si no se encuentra nombreruta, devuelve Null.
atributos
Constante o expresin numrica, cuya suma especifica atributos de archivo. Si se omite, devuelve
todos los archivos normales que satisfacen el nombreruta.
El argumento atributos tiene estas constantes y valores:
Constante
vbNormal
vbHidden
vbSystem
vbVolume
vbDirectory
Valor
0
2
4
8
16
Descripcin
Normal.
Oculto.
Sistema
Etiqueta de volumen; si se especifica se ignoran todos los atributos
Directorio o carpeta.
En Microsoft Windows, Dir permite el empleo de los caracteres comodn '*' (mltiples caracteres) y '?' (un solo
carcter) para especificar varios archivos.
La primera vez que se llama a la funcin Dir se debe especificar el nombreruta, de lo contrario se produce un error. Si
adems se especifican atributos de archivo, se debe incluir el nombreruta.
Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Para obtener ms nombres de archivo que
coincidan con el nombreruta, se debe volver a llamar a Dir sin argumentos.
Cuando no hay ms nombres de archivo coincidentes, Dir devuelve una cadena de caracteres de longitud cero. Cuando
se devuelve una cadena de longitud cero, en las siguientes llamadas se debe especificar nombreruta o se producir un
error. Se puede cambiar el nombreruta sin haber obtenido todos los nombres de archivo que coinciden con el
nombreruta actual. Sin embargo, no se puede llamar a la funcin Dir.
FILECOPY
Copia un archivo.
Sintaxis
fuente
Expresin de cadena que especifica el nombre de un archivo a copiarse puede incluir el directorio o
carpeta y la unidad de disco..
destino
Expresin de cadena que especifica el nombre del archivo de destino se puede incluir el directorio o
carpeta y la unidad de disco.
Si intenta utilizar la instruccin FileCopy en un archivo abierto actualmente, se produce un error.
FILEDATATIME
Devuelve una fecha que indica la fecha y hora en que un archivo fue creado o modificado por ltima vez.
Sintaxis
Variable = FileDateTime(nombreRuta)
6 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo. Se puede
incluir el directorio o carpeta y la unidad de disco.
FILELEN
Devuelve la longitud de un archivo en bytes.
Sintaxis
Variable = FileLen(nombreRuta)
El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo se puede
incluir el directorio o carpeta y la unidad de disco.
Si el archivo especificado est abierto cuando se llama la funcin FileLen, el valor devuelto representa el ltimo tamao
de ese archivo cuando se guard la ultima vez en el disco.
Para obtener la longitud de un archivo abierto, utilice la funcin LOF.
GETATTR
Devuelve un nmero, que representa los atributos de un archivo, directorio o carpeta o una etiqueta de volumen.
Sintaxis
Variable = GetAttr(nombreRuta)
El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo se puede
incluir el directorio o carpeta y la unidad de disco.
Valores devueltos
El valor devuelto por GetAttr es la suma de los siguientes valores de atributos:
Valor
0
1
2
4
16
32
Constante
vbNormal
vbReadOnly
vbHidden
vbSystem
vbDirectory
vbArchive
Descripcin
Normal.
Slo lectura.
Oculto.
Archivo de sistema.
Directorio o carpeta.
El archivo ha sido modificado despus de efectuar la ltima copia de
seguridad.
SETATTR
Establece los atributos de un archivo.
Sintaxis
nombreRuta
atributos
SetAttr nombreRuta;atributos
archivo.
Las constantes y valores de atributos son los mismos que para la instruccin GetAttr
Si se trata de establecer los atributos de un archivo abierto, se producir un error en tiempo de
ejecucin.
FREEFILE
Devuelve el siguiente nmero de archivo disponible para ser usado con la instruccin Open.
Sintaxis
FreeFile[(nmerodeintervalo)]
7 de 7
http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm
El argumento nmerodeintervalo especifica el intervalo desde el que el siguiente nmero de archivo libre se va a
devolver. Se especifica 0 (predeterminado) para devolver un nmero de archivo en el intervalo 1 a 255, inclusive. Se
especifica 1 para devolver un nmero de archivo en el intervalo 256 a 511.
Observaciones
Se usa FreeFile cuando se necesita proveer un nmero de archivo y se quiere asegurar que el
nmero de archivo no est ya en uso.
Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o
parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998