02 diciembre 2006

Generando archivos secuenciales con VBasic .NET y 2005

Pese a lo super modernos que nos hemos vuelto con el almacenamiento de datos, ya sea con ADO, ODBC, Oracle, Informix, SQL Server y hasta access, uno de los archivos más usados por los programas son los archivos de texto.

¿Archivos de texto? te preguntarás. ¿Qué no son ese tipo de archivos que usan los nacos que son tan tercermundistas que no pueden usar ni siquiera el Access que es casi gratuito? Eso creen algunos. Sin embargo, saber usar archivos secuenciales es escencial para poder hacer programas que verdaderamente valgan la pena.

¿Aún crees que son poco usados? Pues la mayor parte de los programas que requieren valores para configurarlos los guardan en archivos de texto (generalmente con extensiones INI o algo por el estilo).

Pero ahora le pregunta es, ¿cómo los programo? ¿Qué tengo que hacer? Precisamente en eso estaba pensando el otro día en una de mis meditaciones matutinas, así que se me ocurrió hacer un programita que generara y leyera archivos de texto secuenciales.

Aquí está la ventana en el modo de diseño. Consta de 5 Textboxes y tres opciones de un MenuStrip:



La opción de salir es muy clara. La idea es que cuando el usuario seleccione la opción Salir, el programa finalice. Por eso su código es tan simple (un simple End) que ni le doy más importancia.

Las otras opciones del menú principal son más interesantes. Del menú Generar muestra 2 maneras en que se pueden generar archivos de texto secuenciales: con o sin streams (los streams son objetios que nos permiten realizar funciones de entrada y salida. Estos son básicos con le manejo de archivos en C++ y como el VBasic .net se parece cada vez más al C++, 'pos ahi sabrás...). Lo que van a hacer estas funciones es grabar el texto de las 4 textboxes al archivo secuencial. LE puse texto por default, pero se puede cambiar por el usuario. De igual manera, el menú Leer consta con las mismas opciones, solo que en este caso son dos diferentes maneras de leer datos de un archivo de texto secuencial y arroja lo leído a la caja de texto grandota, el Textbox5. Así se ve el diseño de los menús:


Ahora sí, como dijo el dermatólogo, vámonos directo al grano: vamos viendo el código. Antes que nada, antes incluso del Public Class Form1, hay que escribir la instrucción Imports System.IO, el cual nos da acceso a las funciones de acceso a los archivos que vamos a usar más adelante.

Después de esto, la clase Form1 tiene 5 funciones: la NormalToolStripMenuItem_Click que se ejecuta cuando selecciona la opción de generar el archivo de texto de manera "normalita" (más adelanto explico el código de éste y las demás funciones), la ConStreamsToolStripMenuItem_Click que genera el archivo usando streams. Luego siguen las funciones que leen del archivo de texto sin y con streams (de hecho, se llaman casi igual que las funciones anteriores. Cuando esto sucede, VBasic le agrega un número al final como podrás observar).


Al hablar de la manera "normal" de escribir archivos, todo el acceso al archivo se hace mediante un número (un entero del 1 en adelante). Para esto resulta muy útil la función FreeFile() el cual nos devuelve el siguiente número disponible. Luego usé la función InputBox para pedir el nombre del archivo. Después de esto, la función FileOpen() me permite abrirlo. Los parámetros son sencillos: primero va el número que va a identificar al archivo, luego el nombre del archivo y después van los parámetros que indican el acceso. En este caso, como quiero escribir, le digo que el modo de apertura es de salida, o sea que vamos a escribir en él (OpenMode.Output) y que el modo de acceso, o sea cómo voy a acceder al archivo, va a ser de escritura (OpenAccess.Write) . Después uso la función WriteLine para escribir cada caja de texto al archivo. Sólo le tengo que dar el número del archivo y la cadena que quiero que escriba. Y al final de todo el rollo, ya que hice todo lo que quise con el archivo y no quiero usarlo más, le digo que cierre el archivo usando la función FileClose. Aquí está todo junto:



Esa es una manera de escribir, pero los chicos que están más en la onda de todo lo relacionado y orientado hacia los objetos prefieren usar streams. En este caso, se va a usar un objeto de tipo StreamWriter que al inicializarlo (con la instrucción New) abre el archivo para escritura (ese archivo se lo dí como parámetro). Después uso el método WriteLine del objeto StreamWriter para escribir todos los renglones. La única diferencia con el método "normal" es que no se necesita el número de archivo ya que este objeto "es" el archivo. Y al final, para cerrarlo todo, uso el método Close para terminar la escribidera.


¿Y qué método es mejor? ¿Con o sin streams? No hay mejores ni peores, solo maneras diferentes de hacer lo mismo. Yo te los comparto para que uses el que se te pegue la gana (suponiendo que se te pegó la gana programar, claro está...).

Ahora toca escribir. De la manera "normal" procedo casi igual que para escribir el archivo, solo que ahora uso los parámetros OpenMode.Input para decirle que el archivo va a dar entrada a datos y el OpenAccess.Read para leer de él. Además, en lugar de usar el WriteLine para leer, uso la función LineInput para leer una línea completa del texto y lo hago dentro de un ciclo (así me aseguro que va todo). Al final, igual que el metodo "normal" anterior, le digo FileClose para cerrar todo el changarro.


Así como leer de manera "normal" es casi igual que escribir de forma "normal", el uso de streams para leer es muy semejante al que se usó para escribir. Solo que ahora el objeto se llama StreamReader y estoy usando una función muy chida para leer todos los datos de un solo jalón: el tremendo ReadToEnd. Existe el LineInput, pero si teniendo algo "más mejor" como dirían en mi pueblo, lo usamos. Este es el código:


Con esto termino, con esto acabo. Presenté aquí dos maneras simples de escribir y leer datos a/desde un archivo secuencial de texto. Ahora faltaría hablar de archivos de acceso aleatorio, pero por lo pronto, ahi muere.
Publicar un comentario
Related Posts Plugin for WordPress, Blogger...