Ficheros en Visual Basic

FICHEROS EN VISUAL BASIC 1 de 7 http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm Este libr

Views 152 Downloads 2 File size 147KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

FICHEROS EN VISUAL BASIC

1 de 7

http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm

Este libro, Visual Basic - Guía del Estudiante se ofrece a todos los estudiantes de habla hispana como texto de libre difusión para fines educativos. Prohibida la copia total o parcial con fines comerciales. Madrid, Julio de 1998 Autor : Luis Suárez Bernaldo Ingeniero de Telecomunicación 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 información de cualquier longitud. En este tipo de ficheros, la información se guarda colocando un carácter tras otro. La forma de leerlos es, igualmente, carácter tras carácter. (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 información de otro posible fichero que ya estuviese en el disco con el mismo nombre, o añadir la información nueva a continuación de la ya existente. Para abrir un fichero secuencial para guardar información, debemos ejecutar la siguiente instrucción: Open Nombrefichero For Output As # Numerocanal De esta forma, si ya existía un fichero llamado Nombrefichero, sobreescribiremos dicho fichero perdiendo la información que contuviese. Es la forma típica de hacerlo cuando modificamos un texto. Para añadir la nueva información tras la ya existente, deberemos abrirlo con la siguiente instrucción: Open Nombrefichero For Append As # Numerocanal Numerocanal debe ser un número comprendido entre 1 y 255. Representa el número del canal por donde introduciremos los datos. Normalmente se llama también número de archivo. No puede haber mas de un archivo abierto con un número de archivo determinado. Para cerrar un fichero secuencial, basta con ejecutar la instrucción: Close # Numerocanal Si no se especifica Numerocanal (la instrucción Close a secas) se cerrarán todos los ficheros abiertos actualmente. Para introducir la información, pueden emplearse dos métodos: Print y Write Print Introduce la información 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 instrucción: 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.

26/06/2015 12:37 a.m.

FICHEROS EN VISUAL BASIC

2 de 7

http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm

Cuando los datos se han introducido con la instrucción 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 instrucción Open Open Nombrefichero For Input As # Numerodecanal Se utiliza la instrucción Input o Line Input para sacar los datos del fichero. La instrucción Input tiene en este caso la siguiente sintaxis: Input (Numero de caracteres, # Numero de canal) Por ejemplo, Input (1, #1) extrae un carácter del fichero abierto como #1. El número máximo de caracteres a extraer de un golpe mediante la instrucción 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 instrucción : Input (LOF(1), #1)

LOF(1)=longitud del fichero #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 carácter a carácter. Input(1,#X) pues tarda poco mas que leyéndolo de un golpe. Sólo se utilizará la instrucción Input con archivos abiertos en modo Input o Binary. (Se verán a continuación) A diferencia de la instrucción Input #, (la veremos a continuación, pues es la instrucción que deberá utilizar para leer archivos escritos con la instrucción Write ), Input devuelve todos los caracteres que lee, incluyendo puntos y coma, retornos de carro, avances de línea, comillas y espacios iniciales. Existe una instrucción, Input$ , que asume que el dato a leer es un String. (Cadena de caracteres). Puede ahorrar un poco de memoria usando esta instrucción en lugar de Input. Nota Se proporciona otra función (InputB) para su uso con datos de byte incluidos en archivos de texto. En lugar de especificar el número de caracteres a devolver, número especifica el número de bytes. INSTRUCCION LINE INPUT La instrucción Line Input se utiliza para extraer una línea completa. Tiene la siguiente sintaxis: Line Input # Número de canal, Variable Mediante esta instrucción se extrae una línea completa (los caracteres delimitados entre dos retornos de carro), y se le asigna esa cadena a Variable La instrucción Line Input # lee un carácter cada vez en un archivo hasta que encuentra un retorno de carro (Chr(13)) o una secuencia retorno de carro-continuación de línea (Chr(13) + Chr(10)). Las secuencias de retorno de carrocontinuación de línea no se tienen en cuenta y no se añaden 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 línea. Con lo que se ha explicado, ya puede realizar un pequeño 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 abriéndolo 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

26/06/2015 12:37 a.m.

FICHEROS EN VISUAL BASIC

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 código 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, carácter a carácter o línea a línea. Para leer carácter a carácter : 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 carácter a carácter TBTexto = TBTexto & VarTexto 'vamos añadiendo los caracteres leídos a TBTexto Loop Close #1 End Sub (NOTA.- Lo expuesto funciona perfectamente, pero el hecho de meter en un TextBox carácter a carácter eterniza la aplicación. - Meter un texto en un TextBox o en un Label es una operación que tarda cierto tiempo. Si esa operación hay que hacerla una vez por carácter, puede tardar mucho tiempo. Para evitar esto, cuando vaya a leer un fichero carácter a carácter, métalo primero en una variable y luego realice un volcado único de esa variable al TextBox o Label) Y podemos hacerlo también leyendo línea a línea con Line Input

Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen Open CD1.filename For Input As #1 Do Until EOF(1) Line Input #1, VarTexto 'leemos el fichero Línea a Línea TBTexto = TBTexto & VarTexto & vbCrLf 'vamos añadiendo las líneas leídas a TBTexto '(Hay que introducir un retorno + avance de línea con cada línea (vbCrLf), ya que VarTexto no ‘contiene los retornos ni avances de línea. Loop Close #1 Los Botones de Guardar tienen el código : Private Sub BGuardar_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowSave Open CD1.filename For Output As #1

26/06/2015 12:37 a.m.

FICHEROS EN VISUAL BASIC

4 de 7

http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm

Print #1, TBTexto.Text Close #1 End Sub O para el caso de abrir con For Append Private Sub BGuardar2_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowSave Open CD1.filename For Append As #1 Print #1, TBTexto.Text Close #1 End Sub Ya hemos visto como se guardan y se leen datos de texto en un fichero secuencial.

Propiedades de los ficheros Secuenciales: EOF Indica el fin del fichero (End Of File). EOF será False hasta que encuentre el final del fichero secuencial. Habrá observado instrucciones tales como: Do until EOF(1) Do While Not EOF(1)

(Hazlo hasta que encuentres el EOF del canal 1) (Hazlo mientras EOF del canal 1 sea False)

Estas expresiones se usan en un bucle, para ir extrayendo con la instrucción Input o Line Input los caracteres de un fichero hasta que se encuentre la marca de final de fichero (EOF) LOC Devuelve la posición de lectura/escritura actual en un archivo abierto. La sintaxis de esta propiedad es: LOC (Numero de canal) la información devuelta para un archivo secuencial es la posición 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)

Ejemplo Long = LOF (1) Observaciones Para obtener la longitud de un archivo que no está abierto utilice la función FileLen. (Véala mas abajo) SEEK Devuelve la posición actual de lectura/escritura de un archivo abierto con la instrucción Open. Sintaxis

Seek(númeroArchivo)

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 posición de byte en la que se va a ejecutar la siguiente operación. El primer byte de un archivo está en la posición 1, el segundo en la posición 2 y así sucesivamente.

26/06/2015 12:37 a.m.

FICHEROS EN VISUAL BASIC

5 de 7

http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm

Funciones y propiedades aplicables a todos los ficheros DIR Devuelve el nombre de un archivo, directorio o carpeta que concuerda con el patrón o atributo de archivo especificado o la etiqueta de volumen de una unidad de disco. Sintaxis

Dir[(nombreruta[, atributos])]

nombreruta Expresión 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 expresión numérica, 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

Descripción 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 comodín '*' (múltiples caracteres) y '?' (un solo carácter) para especificar varios archivos. La primera vez que se llama a la función Dir se debe especificar el nombreruta, de lo contrario se produce un error. Si además se especifican atributos de archivo, se debe incluir el nombreruta. Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Para obtener más nombres de archivo que coincidan con el nombreruta, se debe volver a llamar a Dir sin argumentos. Cuando no hay más 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 función Dir. FILECOPY Copia un archivo. Sintaxis

FileCopy fuente, destino

fuente Expresión de cadena que especifica el nombre de un archivo a copiarse puede incluir el directorio o carpeta y la unidad de disco.. destino Expresión 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 instrucción 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)

26/06/2015 12:37 a.m.

FICHEROS EN VISUAL BASIC

6 de 7

http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm

El argumento con nombre nombreRuta es una expresión 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 expresión 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 función FileLen, el valor devuelto representa el último tamaño de ese archivo cuando se guardó la ultima vez en el disco. Para obtener la longitud de un archivo abierto, utilice la función LOF. GETATTR Devuelve un número, 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 expresión 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

Descripción Normal. Sólo lectura. Oculto. Archivo de sistema. Directorio o carpeta. El archivo ha sido modificado después de efectuar la última copia de seguridad.

SETATTR Establece los atributos de un archivo. Sintaxis nombreRuta atributos

SetAttr nombreRuta;atributos

Expresión de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Constante o expresión numérica cuya suma especifica los atributos de

archivo.

Las constantes y valores de atributos son los mismos que para la instrucción GetAttr Si se trata de establecer los atributos de un archivo abierto, se producirá un error en tiempo de ejecución.

FREEFILE Devuelve el siguiente número de archivo disponible para ser usado con la instrucción Open. Sintaxis

FreeFile[(númerodeintervalo)]

26/06/2015 12:37 a.m.

FICHEROS EN VISUAL BASIC

7 de 7

http://www.frsn.utn.edu.ar/informatica02/industrialii/apuntes/Apuntevb4.htm

El argumento númerodeintervalo especifica el intervalo desde el que el siguiente número de archivo libre se va a devolver. Se especifica 0 (predeterminado) para devolver un número de archivo en el intervalo 1 a 255, inclusive. Se especifica 1 para devolver un número de archivo en el intervalo 256 a 511. Observaciones Se usa FreeFile cuando se necesita proveer un número de archivo y se quiere asegurar que el número de archivo no está ya en uso. Copyright Luis Suárez Bernaldo 1998. Este texto es de libre difusión para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastián de los Reyes (Madrid, España) , Junio de 1998

26/06/2015 12:37 a.m.