Sie sind auf Seite 1von 39

[VISUAL BASIC.

NET CON BASE DE DATOS]

IDSYSTEMS 2012

1 -Introduccin
En esta seccin se ve un repaso bsico de las tres formas de trabajar con diferentes tipos de archivos en visual basic: Archivos secuenciales, archivos aleatorios y archivos binarios. Por ltimo en el final de la seccin, se describe como utilizar sentencias y funciones propias de visual basic para trabajar con archivos y directorios del sistema operativo, como por ejemplo la sentencia Dir para buscar ficheros, Filecopy para copiar , ChDir, Mkdir para crear carpetas y algunas otras funciones relacionadas.

2 - Sentencia FileOpen
Esta sentencia es la encargada de abrir o crear un archivo, ya sea para leer datos del mismo, sobre escribirlos y/o para agregarle datos. Esta sentencia tiene una serie de parmetros que varan de acuerdo a lo que queramos hacer. Por ejemplo :

FileOpen( 1, "c:\prueba.txt", OpenMode.Input)


Este ejemplo abre un archivo para poder acceder a los datos que contenga en su interior. cuando decimos abrir, estamos diciendo que se encuentra actualmente abierto y alojado en la memoria ram para poder manipularlo. En el primer parmetro indicamos el path del archivo en el que queremos trabajar. El primer asignamos diferenciar nmero de parametro indica el nmero de archivo que estamos utilizando. Este nmero lo nosotros y va desde el rango 1 al 511. El "nmero de archivo" se utiliza para poder al archivo en el cdigo. Cada archivo que se encuentra abierto no se puede asignar un archivo igual, ya que nos dara un error en tiempo de ejecucin.

Por ejemplo no podramos hacer esto:

FileOpen( 1, "archivo1.txt", OpenMode.Input) FileOpen( 1, "otroarchivo1.txt", OpenMode.Input)


Una vez que terminamos de trabajar con un archivo que se encuentra abierto y que no lo vamos a utilizar mas, debemos cerrarlo. para ello se utiliza la sentencia FileClose seguido del nmero de archivo que lo identifica. Por ejemplo:

LECCION 2 Manejo de archivos y funciones propias

Pgina 1

[VISUAL BASIC.NET CON BASE DE DATOS]


FileClose(2)

IDSYSTEMS 2012

Esto cerrar al archivo abierto que anteriormente le asignamos el nmero de archivo 2. Tambin si tengo 3 archivos abiertos podra hacer lo siguiente:

FileClose( 1, 2, 3)
Si utilizamos la sentencia FileClose sin ningn parmetro, o mejor dicho ningn nmero de archivo, se cerrarn todos los archivos cargados en memoria por nuestra aplicacin (los que nosotros abrimos con Open). Por lo general, si trabajamos con varios archivos abiertos simultneamente, es aconsejable utilizar la sentencia FileClose sin ningn parmetro, de este modo cuando termine de ejecutarse el procedimiento se cerrarn todos los archivos abiertos. Hay una funcin en Visual basic llamada FreeFile. Esta funcin lo que hace es darnos un nmero de archivo que est libre y que se pueda usar, para que de este modo no intentamos abrir uno est siendo utilizado, y evitar un error en tiempo de ejecucin. Para usar la funcin es muy fcil, por ejemplo:

Dim NumeroArchivo As Integer NumeroArchivo = FreeFile() FileOpen( NumeroArchivo, "La ruta de un archivo", OpenMode.Input)

3 - Archivos secuenciales
Los archivos secuenciales se denominan de esta manera por que la forma de escribir y leer los datos en un archivo es, desde el principio hasta el fin del archivo, es decir, si yo quisiera acceder a un determinado dato del archivo y este dato se encuentra en la mitad del archivo, para llegar a ese dato necesito pasar por todos los dems datos, de forma secuencial. Por lo general se suelen utilizar los archivos secuenciales, para trabajar con archivos que contengan una estructura de datos no muy compleja. por que por ejemplo, si utilizramos un archivo para almacenar 50000 nombres con sus respectivos datos (apellido, telfono, direccin etc...) , este mecanismo resultara ineficiente, ya que si quisiera recuperar por ejemplo el registro n 3650, para leer este dato tendra que pasar previamente por los 3649 registros anteriores a este, haciendo mas lento el acceso y por lo tanto desperdiciando recursos del sistema.

LECCION 2 Manejo de archivos y funciones propias

Pgina 2

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Los archivos secuenciales disponen de una serie de caractersticas que no los habilitan para el uso diario en una aplicacin, pero sin embargo por sus caractersticas permiten que sean usados en temas muy concretos, Trasvase de datos entre empresas. Almacenamientos de datos para tablas de una aplicacin. Guardar datos de configuracin. Normalmente estos datos son cargados al principio de un programa.
4 - FORMATOS

1 ASCII delimitado.
El ASCII delimitado es un formato que permite indistintamente el formato de longitud fija y variable, pues cada dato viene separado del otro con comas. Es el ms estndar, eso significa que los datos se almacenan:

Los datos alfanumricos delimitados entre comillas dobles. Los campos numricos sin delimitadores. Los campos se separan entre si por comas. Los registros incorporan una marca de fin de registro, los caracteres ascii trece y diez.

Los problemas que pueden surgir a la hora de su utilizacin vendrn dados por los distintos tipos de datos numricos que cada aplicacin, o sea el lenguaje en el que se ha desarrollado esa aplicacin, sea capaz de tratar. Como el problema ms normal es ese, una forma de saltarlo es grabar todos los datos como datos de tipo string, que es un tipo de dato que cualquier lenguaje es capaz de tratar sin ningn problema. Existe otro posible problema y es que el lenguaje en cuestin no sea capaz de tratar el formato, la alternativa es la de utilizar la instruccin de lectura, que todos los lenguajes disponen, que permita leer un registro completo, es decir de marca de fin de registro hasta la siguiente. Posteriormente se puede desarrollar una funcin que asle los campos buscando las comas ubicadas entre comillas dobles, y de esa forma se consigue separar los datos.

2 Registros de longitud fija.


Podemos evidentemente grabar registros de datos sin separadores de campos y utilizando una estructura de datos fija y conocida, sino no es posible tratarlos. Se leen y graban con instrucciones que trabajan con registros completos, de marca a marca de fin de registro, o leyendo una sola variable de tipo string. LECCION 2 Manejo de archivos y funciones propias Pgina 3

[VISUAL BASIC.NET CON BASE DE DATOS]


5 - Estructuras.

IDSYSTEMS 2012

Los archivos secuenciales permiten que podamos trabajar con registros de longitud fija o de longitud variable, que es otra de sus ventajas. Otra posibilidad es la de poder utilizar estructuras de registros de distintos tipos en el interior del archivo.
6 - Escritura.

La escritura de cada uno de los formatos que podemos utilizar depender en gran medida de las posibilidades del lenguaje que estemos utilizando, ya que no todos los lenguajes incorporan instrucciones adecuadas a los posibles formatos. La escritura en un formato de longitud fija se podr realizar con una instruccin que permita grabar una variable de tipo string. La escritura de un formato en ascii delimitado es posible realizarla igualmente si no hay una instruccin que genere ese formato directamente con la misma instruccin que antes, pero previamente habr que realizar el montaje de los datos componiendo una cadena de datos con ese formato.
7 - Lectura.

La lectura de uno u otro tipo de estructura de datos depender de la estructura utilizada. Se vuelve a presentar la misma situacin que en la grabacin, puede ser que no dispongamos de instrucciones para la lectura del formato recibido, por lo tanto posiblemente habr que recurrir a la lectura de registros completos, como cadenas de caracteres, para su posterior desmontaje o desglose en los campos y tipos adecuados. Por ejemplo la lectura de un registro de longitud fija puede darse en dos formatos.

Como cadena de caracteres, sin delimitadores. Como ascii delimitado, con delimitadores.

La estructura de longitud variable tambin puede darse bajo los dos tipos de formatos, siempre y cuando cada registro se acompae con las marcas de fin de registro.
8 - Ejemplos de formatos.

El formato que sigue es un formato de registro de longitud fija y con marcas de final de registro. No incorpora delimitadores de campos. LECCION 2 Manejo de archivos y funciones propias Pgina 4

[VISUAL BASIC.NET CON BASE DE DATOS] 0001DENOMINACIONCAMPOCAMPOCAMPO 0002DENOMINACIONCAMPOCAMPOCAMPO

IDSYSTEMS 2012

El formato que sigue es ascii delimitado con campos de longitud fija, pero podran haber sido de longitud variable. Incorpora delimitadores de campo y separadores "," Y las marcas de final de registro.

"0001","DENOMINACION","CAMPO","CAMPO","CAMPO" "0002","DENOMINACION","CAMPO","CAMPO","CAMPO"

El registro que sigue es de longitud fija, sin delimitadores de campo y sin marcas de final de registro. Se hace algo ms complejo su proceso, pues requiere de algn ajuste, y tiene sentido usarse cuando los registros son pequeos, el soporte tambin, que hoy no es el caso, y queremos ajustar por el motivo que sea.

0001DENOMINACIONCAMPOCAMPOCAMPO0002DENOMINACIONCAMPOCAMPOCAMPO
9 - Utilizacin.

Un archivo secuencial, es un archivo que tiene muchas utilizaciones. Cualquier archivo de imagen, sonido, o similares, son archivos que poseen una estructura, una cabecera, y una serie de datos que se leen posteriormente o bien en bloque o de forma secuencial. Basta solo ver las definiciones de las estructuras de los archivos mencionados, para poder entender lo dicho anteriormente. Estos archivos son muy compactos. Un archivo secuencial, al igual que los random y las bases de datos, necesita de ser actualizado. Los que contienen sonido, video e imgenes no necesitan de estos procesos, pero los que almacenan datos s. A pesar de ser archivos que no son habituales en un proceso de gestin, sin embargo surge la necesidad de su utilizacin en algunas ocasiones, o en muchas. Dado que no es un archivo direccionable, el proceso de actualizacin se basa siempre en un proceso de emparejamiento de registros de dos archivos secuenciales, de entrada que da uno nuevo de salida.

LECCION 2 Manejo de archivos y funciones propias

Pgina 5

[VISUAL BASIC.NET CON BASE DE DATOS] El que contiene los datos actuales. El que contiene los nuevos datos.

IDSYSTEMS 2012

El resultado es un archivo nuevo, en el que han desaparecido los registros que haba que borrar, se han incorporado los nuevos y se han actualizado los que tenan algn cambio. En la imagen podemos ver una representacin grfica de dicho proceso.

Adems de la accin de leer y grabar, hay un apartado importante en su tratamiento, y es el de la necesidad de la utilizacin de una estructura repetitiva para su proceso, listado, consulta etc. Esta estructura ser siempre del tipo Mientras

LECCION 2 Manejo de archivos y funciones propias

Pgina 6

[VISUAL BASIC.NET CON BASE DE DATOS] Mientras no Fin de archivo Leer registro Proceso Fin Mientras

IDSYSTEMS 2012

Es importante tener presente que este es el mejor sistema para su proceso. Un bucle del tipo Repite, no es adecuado.
10 - Actualizacin.

El segundo proceso clsico es el de la actualizacin, o el de emparejamiento, son iguales en esencia. Su proceso se basa en el uso de lo que se conoce como high value. Se trata de crear un bucle del tipo mientras, en el que la condicin es que se proceda a leer registros mientras no se alcance el mximo valor en los archivos de proceso. La filosofa es la de emparejar registros como ya se explic en el tema anterior. Importante que el valor utilizado como High value, no sea alcanzable por los datos del archivo. El proceso se basa en que solo puede haber proceso de actualizacin si los cdigos coinciden, en ese caso puede darse el caso de borrado o actualizacin, pero nunca un alta, eso sera un error. Si el cdigo del archivo principal se adelanta al de los cambios, significa que los registros hasta igualarse deben ser del tipo alta, en caso contrario sera un error en la grabacin del archivo de cambios. Si el cdigo del archivo principal se queda por detrs significa que ese cdigo no dispone de incidencias, por lo que debe ser copiado tal como est en el archivo que se crea nuevo en el proceso, para no perder los datos que no van a sufrir cambios. Siempre debemos disponer de una pareja de registros, por lo que al tratar un registro del archivo principal, inmediatamente hay que leer otro. Igual con el de los cambios. Por este motivo antes de entrar en el bucle de proceso, se debe cargar una pareja de registros fuera del bucle. Al realizar la lectura en un archivo si se da la circunstancia de final de archivo, es cuando al cdigo de ese archivo se le asigna el high value. No sirve utilizar variables de tipo booleano, ni cualquier otra combinacin, cuyo nico resultado al final es maquiavlico, comparado con la sencillez de ste proceso. LECCION 2 Manejo de archivos y funciones propias Pgina 7

[VISUAL BASIC.NET CON BASE DE DATOS] If No final(Incidencias) Entonces Leer(Canal, Codigo, .....) Sino Codigo = Hv Fin If No final(Datos) Entonces Leer(CanalDatos, CodDatos) Sino CodDatos = Hv Fin Wientras Codigo <> Hv Or CodDatos <> Hv Segn Codigo Si Codigo = CodDatos Proceso If No final(Incidencias) Entonces Leer(Canal, Codigo, ......) Sino Codigo = Hv Fin If No final(Datos) Entonces Leer(CanalDatos, CodDatos, .....) Sino CodDatos = Hv Fin Si Codigo > CodDatos Proceso If No final(Datos) Entonces Leer(CanalDatos, CodDatos, .....) Sino CodDatos = Hv Fin Si Codigo < CodDatos Proceso If No final(Incidencias) Entonces Leer(Canal, Codigo, ......) Sino Codigo = Hv Fin Fin segun Fin Mientras

IDSYSTEMS 2012

La variable o constante HV debe recibir un valor que sea inalcanzable por los datos del archivo, en caso contrario el proceso no funcionar adecuadamente. Los archivos a procesar deben estar ordenados, pues el proceso realiza una comparacin de los cdigos

LECCION 2 Manejo de archivos y funciones propias

Pgina 8

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

El archivo de incidencias ser igual en diseo que el archivo de datos actuales, y adems incorporar un dato que indicar si es una modificacin, alta o borrado. El proceso se realiza en funcin de los valores del campo cdigo.

11 - Diferentes tipos de acceso


Append: esta sentencia se utiliza para agregar informacin a un archivo de texto. Ejemplo :

FileOpen( 1, "c:\miarchivo.txt", OpenMode.Append)


Si el archivo ya contiene datos, se le agregarn al mismo al final del archivo, si no contena datos los agrega igual. Si el archivo no existe, lo crea y le agrega los datos. Input: la sentencia Input se utiliza para leer datos de un archivo de texto, ejemplo:

FileOpen( 1, "c:\miarchivo.txt", OpenMode.Input)


Este ejemplo abre un archivo para leer los datos del mismo. En las prximas lneas veremos ejemplos de como leer los datos , escribir y guardar. Una cosa importante con respecto a leer datos de un archivo con Input es que, si el archivo que queremos abrir, no existe, se producir un error en tiempo de ejecucin al intentar abrir un archivo que no existe, por eso debemos verificar la ruta del mismo siempre que est bien escrita en la sentencia Open y evitarnos dolores de cabeza, y simpre aadir algn manejador de error para este caso Output: esta sentencia se utiliaza para crear un archivo de texto y grabar datos. Esta es igual que Append salvo por un gran detalle: Output crea el archivo y le agrega informacin, pero si el archivo exista y contena informacin previa, sobre escribe todos los datos del archivo por los datos nuevos, perdiendo los anteriores datos. Si accedemos con Output a un archivo que no existe, no se produce un error, si no que se crea dicho archivo. Conclusin : si vamos a aadir datos a un archivo existente (para actualizarlo por ejemplo) hay que utilizar la sentencia Append. si vamos a crear un archivo vaco y nuevo para grabar nuevos datos,

LECCION 2 Manejo de archivos y funciones propias

Pgina 9

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

hay que utilizar la sentencia Output. si vamos a abrir un archivo para leer datos utilizamos la sentencia Input.

12 - Abrir un archivo.

El primer paso para acceder a un archivo es siempre enlazarlo con el programa, abrirlo. Lo primero es definir una variable que haga referencia al canal, en VB, la forma de identificar un archivo, es saber que canal de enlace utiliza con el sistema.

Dim Canal As Integer


Despus lo ms cmodo es utilizar la funcin freefile, que nos devolver un canal disponible, en lugar de tenerlo que gestionar nosotros.

Canal = FreeFile()
Esta instruccin debe ejecutarse justo antes de abrir el archivo, nunca antes, si no la informacin obtenida puede no ser correcta. El siguiente paso es realizar la apertura, en el modo que nos interese.

FileOpen(Canal, "Nombre.dat", OpenMode.Output)

Para grabar datos la sintaxis es la que sigue:

Dim Canal As Integer Canal = FreeFile() FileOpen(Canal, "Nombre.dat", OpenMode.Output)


Para realizar una lectura:

Dim Canal As Integer Canal = FreeFile() FileOpen(Canal, "Nombre.dat", OpenMode.Input)


Para aadir datos, a un archivo ya existente.

Dim Canal As Integer Canal = FreeFile() FileOpen(Canal, "Nombre.dat", OpenMode.Append)


Matices, si se abre para grabar con Output, si el archivo existe perder su contenido, si no existe se crear. Si se abre para grabar con el modo Append, se aaden los datos a los que pudiera tener. Si se abre con input se accede a l para leer su contenido.

LECCION 2 Manejo de archivos y funciones propias

Pgina 10

[VISUAL BASIC.NET CON BASE DE DATOS]


13 - Grabar una estructura de datos.

IDSYSTEMS 2012

Bueno visto como efectuar la lectura y escritura en un archivo secuencial, conviene ampliar el tema para un archivo con una estructura algo ms amplia. Para la estructura de datos podemos utilizar un array o una coleccin, con el fin de almacenar los datos a utilizar en la misma. La grabacin de los datos no es nada ms que la generacin de un registro de datos con un formato en concreto, uno de los ms extendidos es el ASCII delimitado. En este formato se graban los datos numricos separados por comas y los alfanumricos encerrados entre comillas dobles. VB integra directamente el formato ASCII delimitado, y no es necesario ningn tipo de accin especial. Adems permite grabar registros de longitud variable, bajo una nica variable, til para datos de texto. Para la grabacin de los datos de un registro podemos hacerlo bajo dos formatos. La estructura se graba como una variable definida con una estructura de usuario.

Public Structure Tiostro Public Exped As String Public Nomb As String Public Ape1 As String Public Ape2 As String Public Domic As String End Structure Dim Registro as TipoRegistro
Y grabar

WriteLine(Canal, Registro)
O bien podemos grabar los datos en una variable cada uno de ellos, prescindiendo de la estructura.

WriteLine(Canal, Expediente, Nombre, Domicilio)


14 - Leer un registro.

El siguiente paso sera intentar leer el registro que hemos grabado anteriormente. Para la grabacin sin usar la estructura la lectura es como sigue:

Input(Canal, Expediente) ' cdigo Input(Canal, Nombre) Input(Canal, Domicilio)


Para la grabacin usando la estructura la lectura es como sigue: LECCION 2 Manejo de archivos y funciones propias Pgina 11

[VISUAL BASIC.NET CON BASE DE DATOS] Input(Canal, Registro) ' cdigo


15 - Lectura de un archivo secuencial.

IDSYSTEMS 2012

La lectura de un archivo secuencial se basa siempre en el uso de un bucle del tipo mientras. La estructura de dicho bucle es la que sigue:

While Not EOF(Canal) ' lectura de un registro Input(Canal, Codigo) Input(Canal, Denom) Input(Canal, Cant) Input(Canal, Preci) ' Realizar el proceso correspondiente. End While
16 - Proceso de actualizacin.

El proceso de actualizacin se basa en el emparejamiento de registros, para ello los archivos han de estar grabados en secuencia, en caso contrario no es posible realizar un proceso adecuadamente correcto. El sistema seguido es el de high value, viejo sistema utilizado en otros lenguajes de programacin, pero no por ello menos efectivo. La filosofa es la de emparejar registros como ya se explic en el tema anterior. Importante que el valor utilizado como High value, no sea alcanzable por los datos del archivo. El proceso se basa en que solo puede haber proceso de actualizacin si los cdigos coinciden, en ese caso puede darse el caso de borrado o actualizacin, pero nunca un alta, eso sera un error. Si el cdigo del archivo principal se adelanta al de los cambios, significa que los registros hasta igualarse deben ser del tipo alta, en caso contrario sera un error en la grabacin del archivo de cambios. Si el cdigo del archivo principal se queda por detrs significa que ese cdigo no dispone de incidencias, por lo que debe ser copiado tal como est en el archivo que se crea nuevo en el proceso, para no perder los datos que no van a sufrir cambios. Siempre debemos disponer de una pareja de registros, por lo que al tratar un registro del archivo principal, inmediatamente hay que leer otro. Igual con el de los cambios. Por este motivo antes de entrar en el bucle de proceso, se debe cargar una pareja de registros fuera del bucle. Al realizar la lectura en un archivo si se da la circunstancia de final de archivo, es cuando al cdigo de ese archivo se le asigna el high value. No sirve utilizar variables de tipo booleano, ni cualquier otra combinacin, cuyo nico resultado al final es maquiavlico, comparado con la sencillez de ste proceso. LECCION 2 Manejo de archivos y funciones propias Pgina 12

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

A continuacin exponemos el ncleo del proceso. No est completo, se ha extrado lo esencial, y se ha realizado sin el uso de estructuras.

If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End IF While Exped <> Hv Or ExpedM <> Hv Select Case Exped Case Is > ExpedM ' copiar maestro Grabacion(CanalMaes, ExpedM, NombM, Ape1M, Ape2M, DomicM) If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if Case Is < ExpedM Select Case Tipo Case "1" ' alta Grabacion(CanalMaes, Exped, Nomb, Ape1, Ape2, Domic) If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End IF Case Else ' Error LineaDet(Exped, Nomb, Ape1, Ape2, Domic, Tipo, "Actualiza") If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End If End Select Case Is = ExpedM Select Case Tipo Case "1" ' alta, error ' Lnea de detalle LineaDet(Exped, Nomb, Ape1, Ape2, Domic, Tipo, "Alta") If Not EOF(CanalMoviv) Then
LECCION 2 Manejo de archivos y funciones propias Pgina 13

[VISUAL BASIC.NET CON BASE DE DATOS] LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End if Case "2" ' baja, no se graba If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End if If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if Case "3" ' modificacin, se graba el nuevo Grabacion(CanalMaes, Exped, Nomb, Ape1, Ape2, Domic) If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End if If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if End Select End Select End While

IDSYSTEMS 2012

17 - Cierre

Para ello se utiliza la instruccin FileClose(Canal) Y se cierra cada uno de los archivos que nos interesa.
18 - Archivos aleatorios o directos
A diferencia de los archivos secuenciales, los archivos aleatorios almacenan datos en forma de registros. Como habamos dicho en el captulo anterior para leer datos de un archivo secuencial haba que leer todo el archivo, es decir que no podamos leer por ejemplo los datos que estuviesen en la lnea 35 del mismo sin antes pasar por todos los datos anteriores, por eso su nombre de archivo secuencial.

LECCION 2 Manejo de archivos y funciones propias

Pgina 14

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En cambio los archivos aleatorios, tambin llamados archivos directos, almacenan los datos con una estructura diferente. Los datos se guardan en registros mediante una estructura definida de tipo Type (estructura definida por nosotros) tambin llamada UDT Por ejemplo si tuviesemos 25 registros, cada uno con datos (apellido, email, telefono,etc..), y quisiera acceder al registro 17, puedo leer los datos del registro 17 sin tener que leer los 16 registros anteriores, ganando con ello mas velocidad y teniendo una estructura de datos definida.

19 - Registros.

Mientras que en un archivo secuencial, los datos pueden ser de longitud fija o variable, en un archivo random han de ser de longitud fija, ya que de otra forma no se podra localizar la informacin en el mismo. Adems los campos no llevan separadores entre si, y al final de los registros no existe marcas de final de registro. Evidentemente, a partir de aqu cada cual puede inventar lo que desee, pero esta es la forma adecuada de hacerlo y como lo manejan los lenguajes de programacin mas habituales.

20 - Acceso a los registros.

Hablamos de direccin, pero en realidad lo que se hace es establecer a partir del inicio del archivo, cual es el primer byte que deseamos leer, si estamos trabajando con una estructura de datos que es de longitud fija, el registro x estar, empezar en:

Posicin = Longitud de registro * (X 1)


Si el registro tiene 30 bytes de longitud, el registro nmero dos empezar en el byte 30.

Posicin = 30 * (2 1)
Se considera que el primer byte disponible es el cero, y el primer registro vlido es el cero.

LECCION 2 Manejo de archivos y funciones propias

Pgina 15

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En un archivo random, para almacenar datos, utilizamos estructuras de longitud fija.

21 - Ubicacin de los registros.

El acceso a los registros de un archivo random se realiza a partir de una direccin, esa es la direccin que debe ocupar el registro en el archivo. Despus podemos encontrarnos con dos situaciones para localizar los datos dentro del archivo.

El registro se almacena en la posicin que le corresponde por el valor de su campo cdigo. El registro se almacena por la posicin que le asigna un algoritmo encargado de calcular direcciones a partir de un cdigo.
La situacin ms lgica es utilizar la primera, hoy no tiene sentido utilizar el segundo sistema, pues sera solaparse con un archivo indexado o con una base de datos. En el primer caso, cada registro ocupara siempre una posicin distinta, no pueden haber dos cdigos iguales. En el segundo caso, al ser una direccin proporcionada por un algoritmo, se podra dar la situacin de que cdigos distintos generarn direcciones iguales y hay que controlar esa posible duplicidad, de ah que no tenga sentido llegar a esa complejidad, cuando hoy se disponen de los sistemas de gestin de bases de datos, que nos proporcionan esa tarea hecha. Hay que tener tambin presente que el sistema de cdigo posicin tiene el inconveniente de que puede generar mucho espacio vaco y poco aprovechado, por eso en la actualidad estos archivos se utilizan para almacenar datos muy compactos, y que generan muy poco espacio libre en el archivo, Provincias, Pases, etc.

22 - Libre u ocupado.

Los archivos direccionables, cuando LECCION 2 Manejo de archivos y funciones propias

random se abre,

son se

Pgina 16

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

accede a ellos, se puede grabar o leer indistintamente, esto provoca que necesitemos saber si un registro al que accedemos est libre u ocupado, para saber que hacer con l en el momento de la lectura. Podemos hablar de dos sistemas principalmente para distinguir cuando est libre u ocupado un registro. El primero consiste en grabar a blancos todo el espacio que se prev utilizar para el archivo, utilizando el ASCII treinta y dos. El segundo consiste en incluir en el diseo del registro un campo adicional de un byte para grabar en el un carcter que me indique si est libre u ocupado. Tambin se puede utilizar un campo significativo para en funcin de su contenido decidir esta situacin. De entre los dos sistemas el ms adecuado es el primero, el segundo no es que sea malo, si no al contrario puede llegar a ser hasta mejor, todo depende de las circunstancias en las que nos movamos.

Si grabamos una marca para indicar libre u ocupado, eso implica que podemos conservar los datos originales en el registro aunque se borre, eso es bueno y malo, en funcin de lo que se tenga grabado, ya que implica que se puede recuperar todo lo que hay, lo cual a lo mejor no interesa.

El otro sistema, el de utilizar blancos, tiene la ventaja, o no, de que al borrar un registro se graban blancos en su lugar, ASCII treinta y dos, y eso impide que se pueda recuperar cualquier informacin una vez borrada. Lo importante es determinar un sistema por el cual podamos saber si el registro est libre u ocupado.

23 - Diseo del registro.

LECCION 2 Manejo de archivos y funciones propias

Pgina 17

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En un archivo secuencial podemos establecer un diseo de registro de longitud fija o variable. En un archivo random, el diseo del registro ha de ser de longitud fija. Cada campo tiene un espacio asignado.

El diseo del ejemplo que tenemos en la imagen se corresponde con lo siguiente.

Como podemos ver no hay separacin entre campos, ni entre registros hay marcas de separacin, de ah que es imprescindible conocer el diseo del registro para su utilizacin.
24 - Cmo disear los registros.

LECCION 2 Manejo de archivos y funciones propias

Pgina 18

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En el ejemplo anterior se puede observar que se ha incluido el campo cdigo en el diseo del registro, pero eso no es necesario, si se utiliza el primero de los sistemas de direccionamiento. Si nosotros asumimos que el registro con el cdigo siete lo colocamos en el sptimo registro, cuando accedemos a l, lo localizamos porque sabemos su cdigo, y consecuentemente su direccin, por lo que grabar el cdigo no representa ningn problema, pero resulta redundante. Por lo tanto en el diseo de un registro se puede obviar el espacio que ocupa el campo cdigo.

Esos dos tipos de diseo podemos llamarlos lgico y fsico. El diseo fsico sera el que hemos visto antes. El diseo lgico es el que vemos en la imagen de la derecha, en la que podemos observar que se ha eliminado el campo cdigo.

25 - Utilizacin.

A partir de lo visto los pasos en la utilizacin de un archivo random son los siguientes.

Establecer la estructura del registro en nuestro programa. Acceder al archivo Leer o grabar Cerrar el archivo.

Normalmente las instrucciones de lectura y grabacin en un archivo random no son las mismas que las de un archivo secuencial.

LECCION 2 Manejo de archivos y funciones propias

Pgina 19

[VISUAL BASIC.NET CON BASE DE DATOS]


Sin embargo la filosofa no cambia, abrir, usar y cerrar al final.

IDSYSTEMS 2012

El acceso a los datos sin embargo si que sufre cambios, pues como hemos comentado antes, se puede leer o grabar indistintamente sin necesidad de cerrar y volver a abrir el archivo. Cuando leemos hemos de realizar los siguiente pasos.

Comprobar la direccin del registro que vamos a leer. Realizar la lectura. Comprobar si el registro est libre u ocupado Actuar en funcin de la comprobacin anterior.
A la hora de realizar la grabacin los pasos seran

Asignar los datos a las variables que representan el registro. Grabar los datos.
Se supone que previamente hemos hecho una lectura que nos ha dado como resultado que la direccin a utilizar es la adecuada.
26 - Altas, insercin.

El proceso de insertar o realizar altas en el archivo equivale a realizar una lectura como se ha indicado antes, en la que el resultado de la comprobacin del estado del registro es que ste est libre, y procedemos a realizar una grabacin de datos posteriormente.
27 - Modificacin, actualizacin.

Se repite el proceso anterior, pero en lugar de que la condicin sea que el registro est libre en este caso ha de estar ocupado, y posteriormente realizamos la grabacin de los datos actualizados.
28 - Borrado, eliminacin.

Se vuelve a repetir las condiciones para una modificacin, es decir ha de existir el registro, para a continuacin visualizarlo y confirmar que se desea borrar. El borrado implicar la grabacin de un registro con blancos en la direccin indicada, o la de una marca en el campo correspondiente al estado del registro.
29 - Proceso del archivo.

El uso del archivo en un bucle, solo implica la de realizar un bucle desde la primera hasta la ltima posicin y tratar aquellos registros que se van leyendo que cumplan la situacin de alta u ocupado, en funcin del sistema seguido. LECCION 2 Manejo de archivos y funciones propias Pgina 20

[VISUAL BASIC.NET CON BASE DE DATOS]


30 - Resumen de acciones.

IDSYSTEMS 2012

Como se ha podido comprobar los procesos anteriores se resumen en

Leer Comprobar Proceder


Leer un registro del archivo, que implica comprobar la direccin a leer y realizar la lectura del registro en el archivo. Comprobar su estado. Proceder a realizar la accin correspondiente en funcin del estado del mismo.

Ocupado o Modificacin o Baja Libre o Insercin de registro nuevo, alta.


31. Comentarios.

Los lenguajes de programacin admiten que los campos se puedan definir de cualquiera de los tipos en ellos existentes. Sin embargo la ventaja de utilizar un array of char, string o el tipo equivalente correspondiente en cada uno de ellos, es la compatibilidad que eso supone entre cualquier lenguaje de programacin. Un string, o char, segn toque, siempre tiene un altsimo porcentaje de posibilidades de que se pueda tratar en cualquier lenguaje de programacin. Evidentemente en cualquier gestin, actualmente lo que se utiliza es una base de datos, pero los archivos random, siguen siendo vlidos para muchas tareas, y su conocimiento es necesario.
32 - Abrir el archivo.

La instruccin para la apertura del archivo es FileOpen, y su sintaxis:

FileOpen(Canal,Nombre,OpenMode.Random, , ,Len(Registro))
Donde

Canal Nombre Forma de apertura Longitud

Ser 1, 2, 3 , pero utilizaremos FreeFile para obtener un canal libre. "Fichero.ext" por ejemplo, incluida la ruta. OpenMode.Random, formato de apertura del archivo. Len(Registro) , 56, longitud de registro.

LECCION 2 Manejo de archivos y funciones propias

Pgina 21

[VISUAL BASIC.NET CON BASE DE DATOS]


Y no es necesario cerrar y abrir, para leer o grabar un registro.
33 - Definir la estructura de un registro.

IDSYSTEMS 2012

Antes de proceder a la lectura o grabacin de un registro, hay que definir la estructura del registro que vamos a utilizar.

Structure FilRandom Tipo de usuario <VBFixedString(15)> Public Nom As String <VBFixedString(15)> Public Dire As String <VBFixedString(15)> Public Pobl As String <VBFixedString(2)> Public Prov As String <VBFixedString(9)> Public Tele As String End Structure
Para despus utilizar una variable definida de ese tipo, en lectura o grabacin.

Dim Registro as FilRandom


34 - Lectura.

Variable Registro

Una vez que tenemos definida la estructura del registro y hemos abierto el archivo, podemos leer un registro.

FileGet(Canal, Registro, Posicion)


Donde

Canal Registro Posicin

ser la misma variable utilizada en la apertura. es la variable definida del tipo de la estructura creada. es la direccin donde deseamos realizar la lectura.

La variable registro una vez realizada la lectura, contendr los datos resultantes de la misma bajo la sintaxis

Registro.Nom Regisro.Direc
El cdigo de una accin de lectura podra ser:

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion
LECCION 2 Manejo de archivos y funciones propias Pgina 22

[VISUAL BASIC.NET CON BASE DE DATOS] Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza registro Case Else ' Cdigo libre Mensaje = "El cdigo no existe" End Select ' Campo siguiente Case Else ' Cdigo fuera de rango Mensaje = "Cdigo fuera de rango" End Select Case Else ' Valor inadecuado Mensaje = "Valor del campo incorrecto" End Select
Los pasos seguidos son:

IDSYSTEMS 2012

Select Case Campo00.Text <> ""


Comprobar que el contenido sea distinto de nulo, previamente ya se habr filtrado que el contenido solo pueda ser numrico.

Posicion = CLng(Campo00.Text)
Despus asignamos el valor del texto con contenido numrico a una variable de tipo Long en ste caso, para usarla en la lectura.

Select Case Posicion Case 1 To 20


Comprobamos que est dentro de los lmites y procedemos a leer.

FileGet(CanalAgenda, Reg, Posicion) ' Lectura


Hecha le lectura se comprueba su resultado

Select Case Reg.Nom <> StrDup(15, " ")


Comprobando en este caso que el campo nombre no esta en blanco.

Case True ' Ocupado Visualiza() ' Visualiza registro


Si esta ocupado se procede a visualizar su contenido.

Case Else ' Cdigo libre Mensaje = "El cdigo no existe"


LECCION 2 Manejo de archivos y funciones propias Pgina 23

[VISUAL BASIC.NET CON BASE DE DATOS] End Select ' Campo siguiente

IDSYSTEMS 2012

En caso contrario se deja seguir el programa, o se informa de que no existe el cdigo, segn corresponda. El resto es ya informar de que el cdigo est fuera de rango, o que el valor facilitado es incorrecto, en ste caso porque est vaco.

35 - Grabacin de un registro.

La sintaxis de la instruccin.

FilePut(Canal, Registro, Posicin)


Donde

Canal Registro Posicin

ser la misma variable utilizada en la apertura. es la variable definida del tipo de la estructura creada. es la direccin donde deseamos realizar la grabacin.

La variable registro es la variable que contiene los datos que se van a grabar. Un ejemplo de grabacin podra ser:

Private Sub Grabacion() Dim Posicion As Integer ' GRABACION Posicion = CLng(Codigo) Reg.Nom = Nombre Reg.Dire = Direccion Reg.Pobl = Poblacion Reg.Prov = Provincia Reg.Tele = Telefono FilePut (Canal,Registro,Posicion) MsgBox("Datos grabados", MsgBoxStyle.OKOnly, Me.Text) End Sub
Los pasos seguidos son:

Posicion = CLng(Codigo)
Obtener el valor de la direccin que se va a utilizar en la grabacin.

Reg.Nom = Nombre
Asignacin de los datos a la variable registro del archivo.

LECCION 2 Manejo de archivos y funciones propias

Pgina 24

[VISUAL BASIC.NET CON BASE DE DATOS] FilePut (Canal,Registro,Posicion)


Realizar la grabacin de los datos en el archivo.
36 - Insercin, Alta.

IDSYSTEMS 2012

El proceso de realizar un alta pasa por los siguientes pasos. Podemos tomar como punto de partida la lectura realizada anteriormente, ya que al fin y al cabo la insercin de un registro ha de basarse en una comprobacin previa de que el cdigo no exista. Esta lectura se hara cuando se introduce el campo cdigo. Una vez hecha la lectura de comprobacin el resto es dejar que se vayan introduciendo los datos de cada campo del archivo y al acabar previa confirmacin proceder a grabar los datos. Veamos el control del campo cdigo.

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza datos, y seguimos Case Else ' Cdigo libre, dejamos que siga End Select ' Campo siguiente Case Else ' Cdigo fuera de rango Mensaje = "Cdigo fuera de rango" End Select Case Else ' Valor inadecuado Mensaje = "Valor del campo incorrecto" End Select
Los pasos son igual que en la lectura, porque de hecho el primer paso es una lectura de control.

Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza datos, y seguimos Case Else ' Cdigo libre, dejamos que siga End Select ' Campo siguiente
Cuando comprobamos que el registro est libre u ocupado,

LECCION 2 Manejo de archivos y funciones propias

Pgina 25

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Si esta ocupado podemos elegir entre seguir despus de visualizar su contenido, en cuyo caso el alta se convierte en realidad en una actualizacin, o en pedir un cdigo nuevo. Si est libre simplemente seguimos con la ejecucin y ya est.
Una vez realizada la introduccin de los datos, el siguiente paso es grabar el registro. La grabacin se hara como se ha visto antes, no hay ninguna diferencia

37 - Modificacin, actualizacin.

El proceso de realizar una modificacin puede tomar de nuevo como punto de partida el de la lectura de un registro para realizar un alta, la nica variacin que en ste caso el cdigo debe existir, el resto sera idntico. Veamos el ejemplo

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza datos, y seguimos Case Else ' Cdigo libre, dejamos que siga Mensaje = "Cdigo inexistente." End Select ' Campo siguiente Case Else ' Cdigo fuera de rango Mensaje = "Cdigo fuera de rango" End Select Case Else ' Valor inadecuado Mensaje = "Valor del campo incorrecto" End Select

El cambio est en

Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza datos, y seguimos Case Else ' Cdigo libre, dejamos que siga Mensaje = "Cdigo inexistente." End Select ' Campo siguiente
LECCION 2 Manejo de archivos y funciones propias Pgina 26

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En el mensaje que emitimos y en que de alguna forma hay que conseguir que no se pueda seguir con la introduccin de datos. Cuando comprobamos que el registro est libre u ocupado,

Si esta ocupado podemos visualizar su contenido, y despus actuar ya segn nuestro estilo de hacer las cosas. Si est libre no deberamos permitir que se siga con la introduccin de datos.
Una vez realizada la introduccin de los datos, el siguiente paso es grabar el registro, que se realizar siempre de la misma forma.
38 - Baja eliminacin.

Se vuelve a repetir las mismas condiciones que para realizar una modificacin, pero en este caso solo hay que borrar el registro cuando ste se ha visualizado.

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza datos Borrado() ' Pregunta y borra el registro Case Else ' Cdigo libre, dejamos que siga Mensaje = "Cdigo inexistente." End Select ' Campo siguiente Case Else ' Cdigo fuera de rango Mensaje = "Cdigo fuera de rango" End Select Case Else ' Valor inadecuado Mensaje = "Valor del campo incorrecto" End Select
El cambio est en

Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualiza datos Borrado() ' Pregunta y borra el registro Case Else ' Cdigo libre, dejamos que siga Mensaje = "Cdigo inexistente." End Select ' Campo siguiente
LECCION 2 Manejo de archivos y funciones propias Pgina 27

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Borrado es un procedimiento que realizar una pregunta de confirmacin al usuario y si la respuesta es afirmativa realizara la grabacin de blancos en el registro en cuestin. El procedimiento de grabacin, borrado, puede ser como el ejemplo que sigue.

Private Sub Borrar() Dim Posicion As Integer ' Borrado de un registro a blancos Posicion = CLng(Codigo) Reg.Nom = StrDup(15, " ") Reg.Dire = StrDup(15, " ") Reg.Pobl = StrDup(15, " ") Reg.Prov = StrDup(2, " ") Reg.Tele = StrDup(9, " ") FilePut (Canal, Registro, Posicion) MsgBox("Datos borrados", MsgBoxStyle.OKOnly, Me.Text) End Sub

LECCION 2 Manejo de archivos y funciones propias

Pgina 28

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

39 - Bucle de lectura.

Como podemos comprobar en el organigrama del ejemplo, el bucle no tiene en realidad ninguna complejidad, solo hay que asegurarse en el mismo de que tras la lectura debemos filtrar que el registro que se ha ledo est ocupado, para que pase a proceso.

Private Sub Bucle(Hasta as Integer) Dim Posicin as Integer Posicion = 1 ' iniciar contador While Posicion <= Hasta FileGet(CanalAgenda, Reg, Posicion) Select Case Reg.Nom <> Space(15) Case True ' registro ocupado ' Accin de proceso End Select Posicion = Posicion + 1 ' Incremento del contador End While End Sub
LECCION 2 Manejo de archivos y funciones propias Pgina 29

[VISUAL BASIC.NET CON BASE DE DATOS]


40 - Integrar todas las acciones.

IDSYSTEMS 2012

Si revisamos las acciones de alta, baja, modificacin, y las comparamos veremos que los cambios son mnimos. Y como son mnimos podemos hacer una fusin de todos y obtener un nico programa que sea capaz de realizar todas las tareas de mantenimiento ahorrando cdigo y complejidad cara al usuario. Por lo tanto podra quedar de la siguiente forma la tarea de mantenimiento:

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualizar datos y esperar Case Else ' Cdigo libre, dejamos que se contine End Select ' Campo siguiente Case Else ' Cdigo fuera de rango Mensaje = "Cdigo fuera de rango" End Select Case Else ' Valor inadecuado Mensaje = "Valor del campo incorrecto" End Select
Explicacin filosfica de la propuesta.

Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualizar datos y esperar Case Else ' Cdigo libre, dejamos que se contine End Select ' Campo siguiente

Preguntamos si el registro ledo esta ocupado.

Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualizar datos y esperar Case Else ' Cdigo libre, dejamos que se contine End Select ' Campo siguiente
LECCION 2 Manejo de archivos y funciones propias Pgina 30

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Si est ocupado visualizamos su contenido, se pasa al siguiente dato y se queda a la espera de que

el usuario seleccione la opcin de borrar. desee introducir un cdigo nuevo, retrocediendo al campo cdigo. contine en el campo actual realizando por tanto una modificacin. Select Case Reg.Nom <> StrDup(15, " ") Case True ' Ocupado Visualiza() ' Visualizar datos y esperar Case Else ' Cdigo libre, dejamos que se contine End Select ' Campo siguiente
No se realiza ninguna accin, se pasa al siguiente campo y se asume que es un alta, un dato nuevo. Si es un error porque quera acceder a un cdigo existente, como la pantalla est vaca comprobar si es un error el cdigo que ha introducido y si no lo es podr ver que el cdigo no est grabado, porque no se visualiza nada. Este criterio es fcil de comprender por quien utiliza el programa y fcil de implementar. Tal cual, evidentemente con los cambios requeridos por una base de datos, se aplica para los mantenimientos de las tablas de la base de datos.
41 - Conclusiones.

El uso de un archivo Random permite direccionar los datos que se desean leer o grabar. Conviene reservar o generar todo el espacio que va a utilizar el archivo con blancos para facilitar la gestin. El asignar un espacio al archivo no significa que no pueda aumentar su capacidad de almacenamiento ms adelante. El sistema ms cmodo de direccionamiento es relacionar el cdigo del dato con la posicin del mismo en el archivo. Siempre conviene realizar una lectura de comprobacin para saber cual es la situacin del registro que vamos a tratar. Actualizar es grabar un registro existente con datos. Insertar es grabar un registro que no existe, con datos. Borrar es grabar blancos en un registro que existe. Tienen evidentemente un uso muy concreto actualmente, puesto que las aplicaciones se desarrollan todas en un entorno de base de datos.

42 - Funciones propias de vb para el manejo de ficheros y directorios


Visual basic posee varias funciones para manejar archivos y directorios de nuestro sistema. Las principales son.

LECCION 2 Manejo de archivos y funciones propias

Pgina 31

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

43 - Funcin Dir
La funcin Dir se utiliza o para buscar archivos y devuelve una cadena que representa el nombre de un archivo o directorio de acuerdo a un determinado patrn de bsqueda. La sintaxis de la funcin es:

Dir (ruta, atributos)


En el parmetro ruta debemos indicar el path de un archivo, directorio o unidad. Si el path no existe, la funcin Dir devuelve una cadena vaca. En el parmetro atributos podemos especificar los siguientes: Ejemplo: Si el archivo existe Dir devuelve "autoexec.bat" vbnormal : cualquier atributo de archivo. vbreadonly : archivos de solo lectura. vbhidden: archivos ocultos vbsystem : archivos de sistema vbvolume : etiqueta de volumen de una unidad vbdirectory : directorios

Archivoabuscar = Dir("c:\autoexec.bat")
Tambin podemos utilizar los comodines * y ? para filtrar bsquedas. En este ejemplo devuelve el primer archivo exe que encuentra, si es que existe.

Archivoabuscar = Dir("c:\windows\*.exe")

En este ejemplo la funcin Dir devuelve directorios adems de archivos

LECCION 2 Manejo de archivos y funciones propias

Pgina 32

[VISUAL BASIC.NET CON BASE DE DATOS]


Archivoabuscar = Dir("c:\, vbdirectory") o Archivoabuscar = Dir("c:\", FileAttribute.Directory)

IDSYSTEMS 2012

El nico inconveniente de esta funcin es que siempre devuelve el primer archivo que encuentra. Para que contine buscando los dems archivos debemos poner la funcin sin parmetros. Ejemplo

Dim archivo As String archivo = Dir("c:\*.exe") While archivo <> "" archivo = Dir Wend
En el ejemplo anterior buscar todos los archivos exe en el directorio c:\. cuando ya no encuentre mas devolver una cadena vaca y saldr del bucle While. Este otro ejemplo verifica si un archivo existe:

Private Function Verificar_Existe(path) As Boolean If Len(Trim$(Dir$(path))) Then Verificar_Existe = True Else Verificar_Existe = False End If MsgBox Verificar_Existe End Function Private Sub Form_Load() Call Verificar_Existe("c:\autoexec.bat") End Sub

LECCION 2 Manejo de archivos y funciones propias

Pgina 33

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

44 - Funcin FileCopy
FileCopy nos permite copiar archivos. Esta funcin es muy fcil de usar. ejemplo:

FileCopy( "origen", "destino" ) Nota: si el archivo existe la funcin lo sobre escribe.

45 - Funcin MkDir
Esta funcin se utiliza para crear directorios, pero crea un directorio por vez, es decir que no crea varios niveles al mismo tiempo. La sintaxis es: MkDir( "Ruta directorio") para poder crear un Directorio que contiene varios subdirectorios, podemos hacer lo siguiente: El ejemplo despliega un InputBox para ingresar el path a crear:

Private Sub Command1_Click() Dim i As Integer Dim Array_Dir As Variant Dim Sub_Dir As String Dim El_Path As String El_Path = InputBox("Escriba la ruta del directorio a crear" & _ "con los subdirectorios", " Crear varios niveles de directorios") If El_Path = vbNullString Then Exit Sub 'Desglosa el path Array_Dir = Split(El_Path, "\")

LECCION 2 Manejo de archivos y funciones propias

Pgina 34

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

El_Path = vbNullString 'Recorre el array anterior para ir creando uno por uno For i = LBound(Array_Dir) To UBound(Array_Dir) Sub_Dir = Array_Dir(i) If Len(Sub_Dir) > 0 Then El_Path = El_Path & Sub_Dir & "\" If Right$(Sub_Dir, 1) <> ":" Then ' Verificamos que no exista If Dir$(El_Path, vbDirectory) = vbNullString Then 'Crea la carpeta Call MkDir(El_Path) End If End If End If Next i End Sub 46 - Funcin kill
La funcin kill se utiliza para eliminar archivos. Tambin es muy fcil de utilizar, y el nico parmetro que lleva es la ruta del archivo que queremos eliminar. Si queremos eliminar varios archivos de un directorio podemos utilizar el comodn"*", y si queremos excluir ciertos archivos utilizamos el comodn "?".

Kill( "c:\*.txt")

47 - Funcin FileLen
Esta funcin nos devuelve el tamao en bytes de un archivo. Ejemplo:

LECCION 2 Manejo de archivos y funciones propias

Pgina 35

[VISUAL BASIC.NET CON BASE DE DATOS]


Dim tamao As Long tamao = FileLen("c:\windows\system32\control.exe") MsgBox tamao & " bytes"

IDSYSTEMS 2012

FileLen es muy til para trabajar con archivos aleatorios, ya que si queremos conocer la cantidad de registros que tiene el archivo, debemos dividir el tamao del archivo por el tamao de la estructura. Ejemplo:

Private Type t_personas nombre As String * 20 apellido As String * 20 End Type Dim cant_reg As Long Private Sub Form_Load() cant_reg = FileLen("c:\miarchivo.dat") / Len(t_personas) End Sub

48 - Funcin ReName
Name se utiliza para renombrar archivos y directorios. Esta funcin no se puede utilizar para renombrar archivos abiertos. Ejemplo: ReName( "path del archivo viejo a renombrar", "path y nombre nuevo del archivo" ) Tambin con esta sentencia podemos mover archivos y directorios a otra ubicacin. para ello debemos cambiar en el segundo parmetro la ruta del archivo.

LECCION 2 Manejo de archivos y funciones propias

Pgina 36

[VISUAL BASIC.NET CON BASE DE DATOS]


49 - Funcin GetAttr y SetAttr

IDSYSTEMS 2012

La funcin Getattr permite recuperar informacin sobre los atributos de un archivo o directorio. Ejemplo:

GetAttr "ruta del archivo"


los valores devueltos por la funcin pueden ser los siguientes: 0 - normal 1 - solo lectura 2 - oculto 4 - archivo de sistema 16 - directorio 32 - archivo modificado

El siguiente ejemplo lo que hace es mostrar en un MsgBox los atributos de un archivo. Colocar un TextBox llamado Text1 y un Command1. Cdigo en el formulario:

Option Explicit Private Sub Command1_Click() Dim ret As Long Dim Atributos As String ret = GetAttr(Text1.Text) If ret And vbNormal Then Atributos = " Normal Else Atributos = " Normal End If If ret And vbReadOnly Then Atributos = Atributos & " Solo Lectura Else Atributos = Atributos & " Solo Lectura = No" & vbNewLine = Si" & vbNewLine = No" & vbNewLine = Si" & vbNewLine

LECCION 2 Manejo de archivos y funciones propias

Pgina 37

[VISUAL BASIC.NET CON BASE DE DATOS]


End If If ret And vbHidden Then Atributos = Atributos & " Oculto Else Atributos = Atributos & " Oculto End If If ret And vbSystem Then Atributos = Atributos & " Sitema Else Atributos = Atributos & " Sitema End If If ret And vbDirectory Then Atributos = Atributos & " Directorio Else Atributos = Atributos & " Directorio End If 'Muestra los atributos del archivo elegido MsgBox Atributos, vbInformation, " Atributos " End Sub = No" & vbNewLine = Si" & vbNewLine = No" & vbNewLine = Si" & vbNewLine

IDSYSTEMS 2012

= Si" & vbNewLine = No" & vbNewLine

La funcin SetAttr lo que hace es establecer los atributos de un archivo . Ejemplo:

SetAttr( "ruta del archivo", valores de los atributos )

LECCION 2 Manejo de archivos y funciones propias

Pgina 38

[VISUAL BASIC.NET CON BASE DE DATOS]


50 - Funcin RmDir

IDSYSTEMS 2012

RmDir elimina directorios o carpetas. Pero antes de eliminar directorios tenemos que estar seguros que la carpeta no contiene archivos, de lo contrario nos dar un error en tiempo de ejecucin. Si el directorio contiene archivos debemos eliminarlos previamente con la sentencia kill. Ejemplo:

RmDir( "path del directorio a remover" )

LECCION 2 Manejo de archivos y funciones propias

Pgina 39

Das könnte Ihnen auch gefallen