Manipulación de archivos de texto.

Cuando hablo sobre manipulación de archivos de texto, me estoy refiriendo a los archivos escritos que tenemos guardados en nuestro ordenador o unidad virtual. La manipulación de dichos archivos se basa en la lectura, escritura o modificación de dichos archivos para realizar cualquier acción con ellos. Desde Visual Basic.NET existen muchas formas de manipular los archivos de texto, y en este capítulo veremos algunas técnicas para manipular dichos archivos específicos.

?Qué es un archivo de texto?
Para empezar a establecer la idea, veremos que es un archivo de texto. Un archivo de texto es un archivo específico con un tipo de datos MIME que el sistema operativo liga a un tipo de archivo de texto específico y a una extensión ligada a ese tipo de texto.

Un archivo de texto consta de una o varias líneas de números, palabras o caracteres. Básicamente, un archivo de texto es un texto escrito en formato electrónico. Los archivos de texto, no suelen llevar formatos especiales como sangrías, párrafos, alineaciones, estilos o fuentes especiales. Estos formatos suelen interpretarse por el Software que lee los archivos de texto (como por ejemplo la aplicación de Office, Word). A estos archivos con formatos se les llaman archivos de documentos. Los archivos de texto son reconocidos en el sistema operativo como Documentos de texto y es el propio sistema operativo el que les asigna una extensión al archivo.

tipo de documento de texto

Por ejemplo, el explorador de Windows, asigna las extensiones .txt, .ini, .log o .inf a la mayoría de los archivos de texto que es capaz de leer. Además, estos archivos de texto suelen llevar solo caracteres que reconocen el sistema operativo para que se puedan mostrar rápidamente en el control o programa adecuado. En este capítulo vamos a ver varios métodos para abrir, cerrar, manipular, modificar e incluso eliminar archivos de texto. Pero antes debemos de establecer los objetos que necesitaremos para manipular un archivo de texto.

Objeto StreamReader.

Este objeto pertenece a la librería de .NET Framework y te permitirá abrir y mostrar archivos de texto en los programas en los que se utilice éste objeto. Los archivos mostrados tendrán una codificación universal y es posible que no se muestren caracteres específicos correctamente. Para poder utilizar la clase de StreamReader, debemos de llamar a la librería que lo contiene importando al código la librería que contiene dicha clase. De tal forma, en nuestro formulario fuera del proyecto deberemos de incluir la instrucción:

Imports System.IO

Lo que nos permitirá incluir al objeto deseado.

Crear un nuevo documento de texto.
Ya en la práctica del anterior video pudistes ver como creabamos un archivo de texto para guardar una lista de películas de vídeo. Para no liarnos, vamos a crear un nuevo proyecto, el cual te lo dejaré en la zona de prácticas de dicho capítulo para que te lo descargues.

Como lo que estamos estudiándo es el objeto StreamReader, necesitarás un texto. Podrás copiar dicho texto y guardarlo como un documento de texto al que llamarás mirpas.txt:

"Los tiempos de la crisis que estamos pasando obliga al usuario y al parado a formarse para prepararse a la competitividad que se tiene lugar en el mercado de trabajo. Pero claro, el parado con recursos limitados, no puede afrontar un curso que en cualquier universidad o academia le acarrearía un importante coste económico haciendo posible que tuviese que renunciar a otras cosas más importantes e imprescindibles. De la situación actual de crisis salió la página mirpas.com, que intenta formar de manera gratuita al parado y al usuario a cambio de nada; simplemente una sonrisa y un agradecimiento sería lo mínimo a cambio de cursos cuyo coste alcanzan hasta los tres mil euros por alumno."

Descarga el archivo de texto.

Nuevo proyecto de Windows Form
Para el seguimiento de éste capítulo vamos a realizar un proyecto simple en el cual podremos abrir un documento de texto, editarlo, guardarlo y cerrarlo. El proyecto evolucionará de acuerdo avancemos en el capítulo. Por tanto como ahora vamos a ver el objeto StreamReader, empezaremos realizando la aplicación para que abra un documento de texto. Lo primero que tienes que hacer es abrir un nuevo proyecto de Visual Basic.NET y seleccionar Proyecto de Windows Forms. Como nombre he elegido el nombre de FileOpen en honor a una función de Visual Basic de versiones anteriores (aunque se puede utilizar en .NET perfectamente).

Programa FileOpen

Para abrir el documento de texto, utilizaremos un control OpenFileDialog. El objeto OpenFileDialog que se encargará de seleccionar la ruta hasta el archivo mediante una ventana de Windows para que el usuario lo seleccione. El objeto OpenFileDialog se encuentra en la barra de herramientas del IDE de Visual Basic.NET.

objeto en cuadro de herramientas

Cuando utilizas el objeto OpenFileDialog, éste no se inserta en el formulario, ya que es un objeto de referencia a Windows y no puede usarse en la aplicación sino para hacer referencia a la llamada a la función específica. Por eso aparece debajo de nuestro formulario. Este objeto tiene a su vez una serie de atributos que permiten establecer ciertas funciones específicas en él y que permiten al control ser más exacto en la localización del archivo a buscar. A continuación muestro los más usados y explico su función principal.

OpenFileDialog.Filter.
Este atributo permite establecer las extensiones a buscar de los archivos en cuestión. En este caso buscaremos únicamente los documentos de texto, por lo que la extensión será de .txt; pero podríamos buscar otros tipos de archivos como por ejemplo .docx, .jpg, .pdf, etc. La sintaxis de éste atributo es:

OpenFileDialog.Filter = "Archivos de texto (*.TXT) | *.TXT"

El atributo filtro solamente buscará documentos de texto con la extensión .TXT.

OpenFileDialog.Filename.
Establece la ruta del archivo y el nombre del mismo para que el objeto OpenFileDialog lo pueda utilizar. La sintaxis es:

OpenFileDialog.FileName = 'Ruta en donde está el archivo'

Se suele usar una variable para permitir que abra desde una ubicación específica.

OpenFileDialog.ShowDialog.
Por último el atributo más importante, ShowDialog permite mostrar un cuadro de diálogo para buscar el archivo en cuestión. La sintaxis del atributo:

OpenFileDialog.ShowDialog()

Al igual que el anterior se puede designar por donde puede abrir el cuadro de dialogo. Si no se invoca ninguna dirección, abrirá desde la carpeta en la que se ejecuta la aplicación. Ahora estamos en disposición de empezar con la aplicación FileOpen de Visual Basic.NET.

Diseño del programa.

Para completar la primera parte necesitaremos un par de controles TEXTBOX y un BUTTON para abrir el documento de texto. Con el OpenFileDialog estableceremos la ruta del archivo y lo abriremos para que se cargue junto dentro de uno de los controles TextBox del formulario. Así que completa el formulario en modo diseño tal cual se muestra en la imagen siguiente:

programa para cargar texto

Puedes ver que he agregado dos Label con los nombres de Directorio y Archivo para darle un aspecto visual a la aplicación. El primer TextBox es el superior y en él se cargará la ruta del archivo que se abrirá en el segundo TextBox (el cual es el inferior). Ten en cuenta que la propiedad del TextBox2 de MultiLine, debe de estar en TRUE para que te permita redimensionar el control. Además la propiedad ScrollBar, la dejaremos en Vertical para que se muestre la barra vertical del control. Como tamaño por defecto del Form1, he establecido un alto de 456px y un ancho de 426px y he quitado el botón de maximizar.

alto, ancho

Programándo la aplicación.
Vamos a empezar principalmente importando la librería necesaria para poder utilizar el objeto StreamReader, como ya hemos mencionado con anterioridad. Para ello, en la pantalla de código de nuestra aplicación FileOpen, inserta en la zona que aparece en pantalla la instrucción siguiente:

importa la librería IO

Ahora abre el código del Button1 e introduce el siguiente código que explicaré a continuación:

codigo de carga el texto

La instrucción OpenFileDialog.Filter ="Archivos de texto (*.TXT) | *.TXT", indica que solo aparecerán en la ventana de búsqueda archivos de texto con la extensión .TXT, además de las carpetas que haya en el directorio. Observa que la barra vertical separa el texto a buscar con la extensión de archivos del texto. Esta barra indica al control OpenFileDialog que debe de buscar archivos que se encuentran a su lado derecho. La instrucción OpenFileDialog.ShowDialog(), abre un cuadro de búsqueda de archivos con el filtro designado anteriormente. En la siguiente línea, declaro una variable que asignaré al archivo a abrir asignando a esa variable a un objeto New StreamReader y entre paréntesis le asigno la ruta que escogí con el objeto OpenFileDialog.

Por último asigno al TextBox1 la ruta del OpenFileDialog, por lo que aparecerá la ruta del archivo en el TextBox1. En elTextBox2 asigno la variable creada para la clase StreamReader. Observa que tengo que utilizar junto a la clase StreamReader el atributo ReadToEnd que establece la lectura del archivo desde el inicio hasta el final. La instrucción archivo.Close(), indica que cuando se lee el archivo se cierra, y es obligatorio cerrar el archivo para evitar problemas de lectura. La última instrucción TextBox2.Select(1,0), permite eliminar la selección de texto. Es decir, si seleccionas con el ratón una parte del texto, gracias a esta instrucción puedes borrarla del control sin ningún problema. Cuando ejecutes la aplicación al dar el botón de Abrir se muestra un cuadro de dialogo en el cual te permite escoger un archivo de texto tal y como puedes ver en pantalla.

ventana de busqueda de archivos

aspecto de la ventana

Fijate que el texto cargado tienes carácteres extraños. Eso se debe a la codificación que le pone el propio TextBox2 del control ya que no tiene establecida codificación alguna para traducir las tildes de las vocales.

Para resolverlo rápidamente, a la hora de crear la clase streamReader, declaro la codificación de la manera siguiente:

Dim archiv as StreamReader = new StreamReader (OpenFileDialog1.FileName, System.Text.Encoding.Default)

Así cuando vuelva a cargar el programa, ahora se mostrarán los acentos en las vocales y carácteres como la ñ.

Ahora se muestran los carácteres bien

Acceso a archivos.

El objeto Stream sirve para manipular los archivos de texto y otros tipos de archivos.

Fundamentalmente existen dos tipos de archivos: los de texto y los binarios. Esto obliga en Visual Basic.NET a tratar a los datos como si fuesen de texto o si fuesen binarios.

Un archivo binario es un archivo que no contiene texto sin formato. Los archivos de texto se leen línea a línea o por completo en una variable String. Los archivos binarios deben de ser leídos de acorde al tipo de información que contenga. Por ejemplo un archivo mapa de bits, debe de ser leído byte a byte para que se pueda entender y se represente en pantalla el color específico o la figura correctamente.

Para acceder a un archivo primero se debe de configurar un objeto Stream. Después, se puede crear un objeto Reader para leer la información del archivo. La clase StreamReader se utiliza para la obtención y lectura de archivos de texto, mientras que la clase BinaryReader, para archivos binarios.

También existe un objeto Writer. La clase StreamWrite, permite escribir en un archivo de texto; y la clase BynaryWriter en un archivo binario.

Las clases anteriores requieren de métodos y propiedades para escribir y leer en archivos de diferente tipo. A continuación veremos algunos métodos y propiedades para dicho fin.

La clase FileStream.
Esta clase no se puede usar directamente en el código ya que el CLR de Visual Basic.NET nos mostrará un error de sobrecarga. Por tanto para poder usar esta clase hay que utilizarla mediante los objetos StreamReader / streamWriter y BinaryReader / StreamWriter, y que pertenecen al objeto FileStream.

El objeto FileStream necesita que indiques una ruta del archivo y el modo en que se desea abrir el archivo siendo los modos de lectura, escritura, modificación, etc.

Así pues la forma más simple es de acuerdo a la siguiente sintaxis:

Dim filestream as new FileStream (ruta, modo)

Siendo ruta, la path del archivo; modo la forma de apertura de dicho archivo. Por tanto, la clase FileStream solo define el canal de comunicación entre el archivo, y tu aplicación o la localidad de memoria y tu aplicación; nunca mostrará el archivo en tu aplicación, sino que lo abrirá y ejecutará en Buffer del ordenador para que los objetos StreamReader / streamWriter y BinaryReader / StreamWriter y los puedan utilizar mucho más rápido. Además al utilizar la clase FileStream, el código del archivo se muestra en formato de UTF, por lo que se muestran correctamente los archivos.

La clase StreamReader.
Esta clase ofrece las características necesarias para leer un archivo de texto y cuenta con los métodos necesarios que comparte con el objeto StreamWrite. La sintaxis de éste objeto es la siguiente:

clase streamreader

Los métodos de la clase son los siguientes:

●CLOSE:Éste método cierra la actual instancia del StreamReader y libera los recursos del sistema que hubiese asociado con él.
● PEEK: Devuelve como valor entero el siguiente carácter, sin retirarlo del flujo de entrada. El método peek, no altera la posición actual en el flujo. Si no quedan más caracteres en el flujo, devuelve un -1. También devolverá un -1 si no permite efectuar esta operación.
● READ: Este método lee ciertos números del objeto StreamReader al que se aplica y devuelve el número de caracteres leídos. Si ha llegado al final del flujo, devolverá un -1. La sintaxis del método es la siguiente:

lectura_de_caracteres = read(chars, startIndex, count)

Donde Count es el número de caracteres a leer desde la posición StartIndex del archivo.

● READBLOCK: Este método lee un número de caracteres de un archivo de texto y los almacena en una matriz de caracteres. Acepta los mismos parámetros que el método anterior y devuelve el número de caracteres leídos.
● READLINE: Este método lee la siguiente línea del archivo de texto asociado a la clave StreamReader y la devuelve como cadena. Si encuentra el final del archivo devuelve un NULL. La sintaxis es la siguiente:

Dim txtlinea as string txtlinea =SR.ReadLine()

Ten en cuenta que una línea de texto es una secuencia de carácteres seguida por un retorno de carro, un salto de línea o un conjunto de ambos. La cadena devuelta por el método no incluye el fin de la línea.

● READTOEND: Lee todos los caracteres de la posición actual hasta el final. Generalmente se usa este método para leer el archivo entero. La sintaxis del método es:

texto = SR.ReadToEnd()

Para asegurar que se lee todo el archivo se suele situar el puntero al principio del mismo con el método Seek, antes de llamar al método ReadToEnd de la clase StreamReader.

FS.Seek (0, seekOrigin.Begin)

La clase StreamWriter.
La clase StreamWriter es el canal mediante el cual se enviarán datos al archivo de texto. Para declarar un nuevo objeto StreamWriter hay que declarar (al igual que el anterior clase), una variable de este tipo, tal cual se muestra.

Dim SW as new streamWriter

CLR permite establecer la ruta del archivo de texto a crear, por lo que puede quedar de la forma siguiente:

Dim SW as new StreamWriter(path)

Siendo path la ruta en la cual se guardará el archivo de texto.

Dim SW as New StreamWriter("C:\mirpas.txt")

El Objeto creado tiene la codificación por defecto de UTF-8 y un tamaño de buffer por defecto. También puede ser que exista el archivo. Para sobrescribir el archivo debes de utilizar la instrucción OverWrite tal cual se muestra:

Dim SW as New StreamWriter("C:\mirpas.txt",OverWrite, Encoding, BufferSize)

Donde Encoding establece una codificación y BufferSize, un tamaño de buffer diferente.

El objeto StreamWriter también posee una serie de propiedades.

● NEWLINE: Esta propiedad del objeto StreamWriter le permite utilizar la cadena utilizada para terminar cada línea del archivo. Esto es que termina mediante el método WriteLine detrás del texto.

A continuación se muestran los métodos que utiliza dicho objeto StreamWriter.

● AUTOFLUSH: Devuelve un Bolean que determina si los métodos que escriben en el archivo (Write y WriteString), también volcarán el buffer. Si el resultado es FALSE, el bufer se volcará en el archivo en cuando Windows tenga una oportunidad. El valor FALSE podría mejorar el rendimiento del sistema con archivos grandes.
● CLOSE: Este método cierra el objeto StreamWriter y libera los recursos del sistema asociados al mismo (recupera RAM). Siempre que se use el método StreamWriter se debe de cerrar mediante este método.
● FLUSH: Este método escribe en el archivo cualquier información pendiente en el buffer.
● WRITE: Este método escribe el valor indicado en el archivo.
● WRITELINE: Este método es similar al anterior, pero añade un salto de línea tras guardar el archivo.