You are on page 1of 24

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

MANUAL DE VISUAL BASIC .NET CON BASES DE DATOS

LECCION 1 Archivos en VB

Pgina 1

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

CONCEPTO DE ARCHIVO
Un archivo o fichero (file) es una estructura de datos que reside en memoria secundaria, consistente en un conjunto de informaciones estructuradas en unidades de acceso denominadas registros, todos del mismo tipo y en nmero indeterminado. Dentro de un archivo es posible almacenar cualquier tipo de informacin, ya sea personalizada por el usuario de modo aleatorio (sin formato). Cuando hablamos de personalizada nos referimos a que el usuario tiene la posibilidad de almacenar los datos de acuerdo a sus necesidades, ya sea agregando caracteres especiales, smbolos, etc., para facilitar su lectura. El termino modo aleatorio (sin formato) se refiere al almacenamiento de los datos sin especificaciones especiales, es decir, sin aplicar ninguna alteracin a la estructura de los datos. Por ejemplo, el almacenamiento del contenido de una caja de texto en un archivo de texto. Los archivos que poseen cierto tipo de estructuras especiales se les denomina archivos de bases de datos. Este ser el caso de estudio del siguiente captulo. Un archivo puede estar en cualquier parte de un disco ya sea en una carpeta o en una subcarpeta. Comnmente vienen representados por un icono y un nombre que permite diferenciarlos de los dems archivos del disco.

CARACTERSTICA DE LOS ARCHIVOS


Un archivo se podra representar grficamente de la siguiente manera: NombreArchivo.Extensin NombreArchivo: Puede ser cualquier cadena de caracteres especificada por el usuario (programador). Extensin: Una extensin en un archivo se representa por tres letras que hacen referencia al tipo de archivo. Por ejemplo, la extensin para un archivo de texto sera (.TXT), para un archivo de datos (.DAT), para un archivo de documento (.DOC), para un archivo por lotes (.BAT), para un archivo ejecutable (.EXE), etc. Un archivo en Windows se representa por un ICONO y debajo de este, el nombre del archivo sin la extensin. Cuando Windows conoce el tipo de archivo entonces muestra un ICONO que hace referencia al tipo de archivo y omite la presentacin de la extensin y cuando no conoce el tipo de archivo agrega un ICONO blanco que representa una aplicacin archivo desconocido. Para entender lo explicado anteriormente visualizare el contenido del directorio de Windows en mi disco duro para por observar la caracterstica de los archivos que contiene esta carpeta. Ejemplo: Al visualizar mi carpeta de Windows aparecen los siguientes archivos y carpetas:

LECCION 1 Archivos en VB

Pgina 2

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Si observa detenidamente que cada tipo de archivo posee un tipo de ICONO (imagen) distinto y que los archivos que Windows no conoce se presentan con un ICONO blanco con una ventana .

La remodelacin del viejo esquema de entrada y salida


Desde las primeras versiones del lenguaje, el programador de Visual Basic ha dispuesto de un conjunto de instrucciones y funciones para el manejo de las operaciones de lectura/escritura con archivos, y la gestin de los mismos dentro del sistema operativo, en cuanto a su creacin, borrado copia, etc., entre directorios y unidades. Si bien este modo de trabajo ha sido vlido durante mucho tiempo, la incorporacin de las tcnicas OOP a los lenguajes de programacin, hacan necesario una renovacin en este aspecto de VB. Las instrucciones Open, Input, Write, Put, etc., a pesar de resolver su cometido, no proporcionan un entorno de trabajo cmodo, en un mundo en el que cada vez prima ms el trabajo con objetos. La jerarqua de objetos FileSystemObject, introducida recientemente, vino a paliar en parte esta carencia, aportando un conjunto de clases que ya nos permitan, desde un prisma orienta a objeto, trabajar con todos los aspectos del sistema de archivos, en cuanto a su lectura, escritura, manejo de directorios, unidades, etc. La evolucin de este conjunto de objetos se halla en la plataforma .NET.

LECCION 1 Archivos en VB

Pgina 3

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

System.IO, partida

el

punto

de

Con la llegada de la tecnologa .NET, el acceso al sistema de archivos, es un aspecto que ya no forma parte de un lenguaje determinado, como ocurra en las anteriores versiones de VB, sino que ha sido integrado dentro de la jerarqua de clases de la plataforma, en el espacio de nombres IO de System. Con ello, todos los lenguajes compatibles con .NET podrn utilizar este conjunto de objetos. Las clases incluidas en System.IO, nos van a permitir realizar labores de lectura y escritura en archivos de texto, binarios, etc., as como la creacin y manipulacin de los archivos y directorios que contienen la informacin. A lo largo de este tema realizaremos una descripcin, y ejemplos de uso, de algunas de las clases contenidas en IO. Por lo que, en todos los ejemplos utilizados aqu, tendremos que importar este espacio de nombres.

Objetos Stream
Un objeto Stream representa un flujo o corriente de datos, es decir, un conjunto de informacin guardada en formato de texto o binario, que podremos leer y escribir sobre un soporte fsico, tambin denominado en la plataforma .NET, almacn de respaldo (backing store). Algunos tipos de Stream, para optimizar el flujo de transferencia de datos entre el objeto y su medio fsico de almacenamiento, disponen de una caracterstica denominada almacenamiento intermedio (buffering), que consiste en mantener un bfer intermedio con los datos. En el caso, por ejemplo, de tareas de escritura, todas las operaciones se realizaran en el bfer, mientras este dispusiera de capacidad. Una vez terminado el proceso de escritura, o cuando el bfer estuviera lleno, su contenido pasara al archivo fsico. Podemos tambin, alterar el comportamiento por defecto del bfer a travs de diversas propiedades y mtodos del objeto Stream correspondiente.

Las clases TextWriter

TextReader

Estas clases contienen los miembros genricos para realizar lectura y escritura de caracteres. Se trata de clases abstractas, por lo que deberemos utilizar las clases derivadas StreamReader, StreamWriter, StringReader y StringWriter, comentadas a continuacin.

La clase StreamWriter
Un objeto StreamWriter realiza operaciones de escritura de texto sobre un

LECCION 1 Archivos en VB

Pgina 4

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


archivo. El proceso tpico de escritura de datos mediante un StreamWriter, comprende los siguientes pasos:

Instanciar un objeto de esta clase mediante alguno de los constructores disponibles. Aqu creamos un nuevo archivo para escribir datos sobre l, o abrimos uno existente. Escritura de texto mediante los mtodos WriteLine( ) y Write( ). El primero escribe el texto pasado como parmetro, y aade los caracteres especiales de retorno de carro y nueva lnea. El segundo escribe el texto pasado y deja el puntero de escritura a partir del ltimo carcter escrito, con lo que no produce un cambio automtico de lnea. Deberemos utilizar la propiedad NewLine para introducir manualmente un salto de lnea.

Cierre del Stream con el mtodo Close( ). Esta accin vuelca el contenido del bfer del objeto en el archivo. El Cdigo fuente 410 muestra el proceso bsico que acabamos de describir.
Imports System.IO Module Module1 Sub Main() Dim swEscritor As StreamWriter ' creamos un stream de escritura, y al mismo tiempo un ' nuevo archivo para escribir texto sobre l swEscritor = New StreamWriter("\pruebas\NOTAS.txt") ' escribir lneas swEscritor.WriteLine("esta es la primera lnea") swEscritor.WriteLine("segunda lnea de texto") ' ahora escribimos texto pero sin provocar un salto de lnea swEscritor.Write("Juan y Luna ") swEscritor.Write("van de paseo") swEscritor.Write(swEscritor.NewLine) ' esto introduce el salto de lnea swEscritor.WriteLine("con esta lnea cerramos") ' cerrar el stream y el archivo asociado swEscritor.Close() End Sub End Module Cdigo fuente 410

Algunas de las clases de tipo Stream de escritura disponen del campo compartido Null, que permite realizar una operacin de escritura que no ser volcada en el medio fsico de almacenamiento, con lo que se perdern los datos escritos. Ver el Cdigo fuente 411.

' escribir a un medio inexistente (nulo) swEscritor.Null.WriteLine("este texto no llegar al archivo")

LECCION 1 Archivos en VB

Pgina 5

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Cdigo fuente 411

En el caso de que el archivo sobre el que vamos a escribir ya exista, podemos utilizar un constructor de StreamWriter que nos permite especificar si vamos a aadir texto al archivo o vamos a sobrescribir, perdiendo el texto que hubiera. Veamos un ejemplo en el Cdigo fuente 412.
' abre el archivo y se sita al final del texto para aadir swEscritor = New StreamWriter("\pruebas\NOTAS.txt", True) ' se elimina el contenido previo del archivo swEscritor = New StreamWriter("\pruebas\NOTAS.txt", False) Cdigo fuente 412

Despus de crear un objeto de este tipo, y escribir algunas lneas de texto sin cerrar el Stream, si abrimos su archivo de texto correspondiente, nos encontraremos con que no hay texto dentro del archivo. Ello es debido a que todava no se ha volcado el contenido del bfer del objeto sobre el archivo. Para forzar dicho volcado, deberemos llamar al mtodo Flush( ), que se encarga de traspasar el bfer al archivo asociado al Stream. Veamos el Cdigo fuente 413.
Dim swEscritor As StreamWriter ' creamos un stream de escritura swEscritor = New StreamWriter("\pruebas\NOTAS.txt", False) ' escribir lneas swEscritor.WriteLine("la primera lnea") swEscritor.WriteLine("un poco ms de texto") ' si abrimos el archivo antes de la siguiente, estar vaco swEscritor.Flush() ' ahora el archivo ya contendr texto ' cerrar el stream y el archivo asociado swEscritor.Close() Cdigo fuente 413

La clase StreamReader
Un objeto StreamReader realiza operaciones de lectura de texto sobre un archivo. El proceso que debemos llevar a cabo para leer el contenido de un Stream de lectura es muy similar al de escritura: instanciar el objeto con uno de sus constructores, abriendo un archivo para leer; ejecutar alguno de los mtodos de lectura del StreamReader, y cerrar el objeto con Close( ). Entre los mtodos de lectura de este objeto, tenemos ReadLine( ), que devuelve una lnea del archivo; y ReadToEnd( ), que devuelve el resto del contenido del archivo, desde el punto en el que se encontrara el Stream al realizar la ltima lectura. Veamos unos ejemplos en el Cdigo fuente 414.

LECCION 1 Archivos en VB

Pgina 6

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Dim srLector As StreamReader = New StreamReader("\pruebas\NOTAS.txt") Console.WriteLine("**Leer una primera lnea**") Dim Linea As String Linea = srLector.ReadLine() Console.WriteLine("La lnea contiene --> {0}", Linea) Console.WriteLine() Console.WriteLine("**Ahora leemos el resto del archivo**") Dim Texto As String Texto = srLector.ReadToEnd() Console.WriteLine("El texto restante contiene --> {0}", Texto) srLector.Close()

' ***********************************************
' leer lnea a lnea mediante un bucle Dim srLector As StreamReader = New StreamReader("\pruebas\Datos.txt") Dim Linea As String Dim ContadorLin As Integer = 1 Linea = srLector.ReadLine() Do While Not (Linea Is Nothing) Console.WriteLine("Lnea: {0} - Contenido: {1}", ContadorLin, Linea) ContadorLin += 1 Linea = srLector.ReadLine() Loop

Otro de los mtodos de lectura es ReadBlock( ), que recibe como parmetro un array de tipo Char, sobre el que se depositarn una cierta cantidad de caracteres ledos del archivo. En el segundo parmetro de este mtodo indicamos la posicin del array desde la que se comenzarn a guardar los caracteres. En el tercer parmetro, el nmero de caracteres a leer. El mtodo Read( ), tambin permite realizar una lectura igual que ReadBlock( ), pero en el caso de no utilizar parmetros, devuelve un valor numrico, correspondiente al cdigo del carcter que acaba de leer. Cuando llega al final del Stream, devuelve 1. Para convertir de nuevo a carcter los valores que devuelve Read( ), debemos pasar estos valores a un array de tipo Byte, y despus, utilizando un objeto ASCIIEncoding, mediante su mtodo GetString( ), pasaramos el array a una cadena. Veamos unos ejemplos de estos mtodos en el Cdigo fuente 415.
Imports System.IO Imports System.Text Module Module1 Sub Main() ' crear un Stream de lectura Dim srLector As StreamReader = New StreamReader("\pruebas\NOTAS.txt") ' obtener valores del Stream con el mtodo ReadBlock() ' ---------------------------------------------------' crear un array Char que contendr los caracteres ledos Dim Caracteres(15) As Char ' leemos 16 caracteres del archivo y los pasamos al array ' comenzando a grabarlos a partir de su posicin 0 srLector.ReadBlock(Caracteres, 0, 16) ' pasamos el array de valores Char a String mediante ' el constructor de la clase String que recibe como ' parmetro un array Char

LECCION 1 Archivos en VB

Pgina 7

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Dim Parte1 As String = New String(Caracteres) Console.WriteLine("Resultado de la lectura con ReadBlock()") Console.WriteLine(Parte1) Console.WriteLine() ' obtener valores del stream con el mtodo Read() ' ----------------------------------------------Dim Valor As Integer Dim Codigos() As Byte ' vamos a ir volcando en un bucle los cdigos de carcter ' leidos desde el archivo a un array Byte Valor = srLector.Read() While (Valor <> -1) ' cuando lleguemos al final, obtendremos -1 If Codigos Is Nothing Then ReDim Codigos(0) Else ReDim Preserve Codigos(Codigos.GetUpperBound(0) + 1) End If Codigos(Codigos.GetUpperBound(0)) = Valor Valor = srLector.Read() End While Dim Codificador As New ASCIIEncoding() Dim Parte2 As String ' con el objeto ASCIIEncoding, mtodo GetString(), ' obtenemos una cadena, pasando como parmetro un array ' de tipos Byte Parte2 = Codificador.GetString(Codigos) Console.WriteLine("Resultado de la lectura con ReadBlock()") Console.WriteLine(Parte2) Console.ReadLine() End Sub End Module Cdigo fuente 415

Finalmente, el mtodo Peek( ), al igual que Read( ), devuelve el siguiente valor disponible del Stream, pero sin extraerlo del bfer, con lo que deberemos utilizar alguno de los mtodos anteriormente descritos para realizar una lectura real.

Las clases StringReader

StringWriter

Estas clases proporcionan la misma funcionalidad que StreamWriter y StreamReader, con la diferencia de que StringWriter trabaja con un objeto StringBuilder como almacn de datos, mientras que StringReader utiliza un String para leer su contenido.

La clase Stream (flujo de datos)


La clase Stream representa un flujo o corriente de datos, es decir, un conjunto secuencial de bytes, como puede ser un archivo, un dispositivo de entrada/salida, memoria, un conector TCP/IP, etc.

LECCION 1 Archivos en VB

Pgina 8

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Se trata de una clase abstracta, por lo que si queremos hacer uso de un stream concreto, tenemos que acudir a alguna de sus clases derivadas como son FileStream, MemoryStream, BufferedStream, etc.

La clase FileStream
Realiza escritura y lectura de bytes sobre un archivo; en el caso de que el archivo no exista, lo crearamos al mismo tiempo que instanciamos este objeto.

Uno de los constructores de esta clase, nos permite especificar una cadena con la ruta del archivo a utilizar, mientras que en el segundo parmetro utilizaremos un valor de la enumeracin FileMode, mediante la que indicamos el modo de trabajo sobre el archivo: aadir, abrir, crear, etc. Las propiedades CanRead, CanWrite y CanSeek, devuelven un valor lgico que nos informa de si en el objeto podemos realizar operaciones de lectura, escritura y desplazamiento por los bytes que contiene. Para escribir datos, disponemos del mtodo WriteByte( ), que escribe un byte en el archivo; y tambin tenemos el mtodo Write( ), que escribe de un array de bytes pasado como parmetro, una cantidad de elementos determinada empezando por una de las posiciones de dicho array. Veamos un ejemplo de escritura en el Cdigo fuente 416.
' escrituras con Filestream Dim oFileStream As FileStream oFileStream = New FileStream("\pruebas\apuntes.dtt", FileMode.CreateNew) oFileStream.Write(New Byte() {15, 160, 88, 40, 67, 24, 37, 50, 21}, 0, 6) oFileStream.WriteByte(75) Console.WriteLine("Opciones en el FileStream") Console.WriteLine("Podemos leer: {0}", IIf(oFileStream.CanRead, "SI", "NO")) Console.WriteLine("Podemos escribir: {0}", IIf(oFileStream.CanWrite, "SI", "NO")) Console.WriteLine("Podemos movernos: {0}", IIf(oFileStream.CanSeek, "SI", "NO")) oFileStream.Close() oFileStream = Nothing Cdigo fuente 416

Para las operaciones de lectura, tenemos ReadByte( ), que devuelve el valor sobre el que est posicionado el objeto en ese momento. Tambin disponemos del mtodo Read(), que traspasa valores un array de bytes. Si queremos desplazarnos por los elementos del Stream, podemos utilizar el mtodo Seek(), pasando la cantidad de posiciones a movernos, y el punto desde el que queremos realizar dicho desplazamiento, mediante los valores de la enumeracin SeekOrigin. Para averiguar el elemento del Stream en el que estamos situados, disponemos de la propiedad Position

LECCION 1 Archivos en VB

Pgina 9

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


. Veamos algunos ejemplos de lectura sobre este tipo de objetos, en el Cdigo fuente 417.

' lectura con FileStream Dim oFileStream As FileStream oFileStream = New FileStream("\pruebas\apuntes.dtt", FileMode.Open) Dim Valor As Byte Valor = oFileStream.ReadByte() ' obtener un valor Console.WriteLine("Se ha leido el valor: {0}", Valor) Console.WriteLine("Nos desplazamos dos bytes en el stream") oFileStream.Seek(2, SeekOrigin.Begin) Valor = oFileStream.ReadByte() Console.WriteLine("Se ha leido el valor: {0}", Valor) Console.WriteLine("La posicin actual del stream es: {0}", _ oFileStream.Position) ' leer varios valores, pasndolos a un array ' previamente dimensionado Dim VariosValores(3) As Byte oFileStream.Read(VariosValores, 0, 4) Console.WriteLine("Leer bloque de valores del stream") Dim Enumerador As IEnumerator Enumerador = VariosValores.GetEnumerator() While Enumerador.MoveNext Console.WriteLine("Valor: {0}", Enumerador.Current) End While Console.ReadLine()

Las clases BufferedStream y MemoryStream, que tambin heredan de Stream, disponen de los mismos miembros que FileStream, teniendo como principal diferencia el que utilizan la memoria de la mquina como almacn de respaldo.

CREACIN DE UN ARCHIVO ALEATORIO (SIN FORMATO)


Con Visual Basic.NET, Microsoft introdujo un nuevo, metodo orientado a objetos para trabajar con archivos. El namespace System.IO en el framework .NET provee algunas clases para trabajar con archivos de texto, archivos binarios, directorios y partes de bytes. Veremos especificamente como trabajar con archivos de texto usando las clases del namespace System.IO METODOS BASICOS Antes de comenzar a trabajar con los archivos de texto, necesitamos crear un nuevo archivo o abrir uno existente. Eso requiere la clase System.IO.File. Esta clase contiene metodos para muchas operaciones de archivo comunes, incluyendo copiar, boarrar, manipulacion de atributos de archivo y existencia de archivo. Para nuestro siguiente trabajo, usaremos los metodos CreateText y OpenText CREATETEXT

LECCION 1 Archivos en VB

Pgina 10

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Asi como lo indica su nombre, el metodo CreateText crea un archivo de texto y regresa un objeto System.IO.StreamWriter. Con este objeto, usted puede escribir al archivo. El siguiente codigo demuestra como puede crear un archivo de texto:

Dim oFile as System.IO.File Dim oWrite as System.IO.StreamWriter oWrite = oFile.CreateText(C:\sample.txt)


OPENTEXT El metodo OpenText abre un archivo existente de texto para lectura y regresa un objeto System.IO.StreamReader. Con este objeto, usted puede leer el archivo. Veamos como se usa:

Dim oFile as System.IO.File Dim oRead as System.IO.StreamReader oRead = oFile.OpenText(C:\sample.txt)

ALMACENAMIENTO DE INFORMACIN UN ARCHIVO DE TEXTO


Los metodos en la clase System.IO.StreamWriter para escribir al archivo de texto son Write y WriteLine. La diferencia entre estos metodos es que el metodo WriteLine agregar un nuevo carcter de nueva linea (Enter) al fina de la linea, mientras que el metodo Write no lo hace. Cualquiera de estos metodos son usados para sobreescribir varios tipos de datos y para escribir texto formateado al archivo. El siguiente ejemplo demuestra como se usa el metodo WriteLine
oWrite.WriteLine(Escribir una linea al archivo) oWrite.WriteLine() Escribe una linea en blanco al archivo

Formateando la salida Tanto los metodos Write como WriteLine soporta el formato de exto durante la salida. La habilidad para formatear la salida ha sido significativamente mejorada sobre versiones anteriores de Visual Basic. Hay algunos metodo para realizar esto. Algunos son:
oWrite.WriteLine({0,10}{1,10}{2,25},Date,Time,Price) oWrite.WriteLine({0,10:dd MMMM}{0,10:hh:mm tt}{1,25:C},Now(), 13455.33) oWrite.Close()

El metodo usado en estos ejemplos es aceptar una cadena para ser formateada y despues un parametro de arreglo de valores es usado en la cadena a formatear. Veamos esto mas detenidamente. La primer linea escribe un encabezado para nuestro reporte. Note que la primera cadena es esta linea es {0,10}{1,10}{2,25}. Cada segmento (entre llaves) consiste en dos numeros. El primer numero es el indice del elemento a ser desplegado en el arreglo del parametro (Note que el este parametro del arreglo es basado en cero). El segundo numero representa el tamao del campo en el cual el parametro sera impreso. La alineacion del campo tambien puede ser definida: los valores positivos son alineados a la izquierda y los valores negativos a la derecha. La segunda linea demuestra como formatear los valores de varios tipos de datos. El primer campo es definido como {0,10:dd MMMM}. Esto desplegara el dia actual (tomado usando la funcion Now()) en el formato de 02 July. El segundo campo desplegara la hora actual

LECCION 1 Archivos en VB

Pgina 11

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


formateada como 02:15 PM. El tercer campo formatearea el valor 13455.33 en un formato de moneda como este definido en la computadora loca. Asi que si en la maquina esta puesta para dolares U.S, el valor se formateara como $13,455.33

LECTURA DE UN ARCHIVO ALEATORIO (SIN FORMATO)


La clase System.IO.StreamReader soporta algunos metodos para leer los archivos de texto y ofrece una forma para determinar si usted esta al final del archivo que es diferente de versiones anteriores de Visual Basic.

Linea-por-linea Leer un archivo de texto linea por linea es pesado. Podemos leer cada linea con el metodo ReadLine. Para determinar que se ha alcanzado el final del archivo, llamamos al metodo Peek del objeto StreamReader. El metodo Peek lee el siguiente carcter en el archivo sin cambiar el lugar de donde esta actualmente leyendo. Si se ha alcanzado el final del archivo, Peek regresa -1. Un archivo completo Tambien puede leer un archivo de texto completo desde la posicion actual hasta el final del archivo usando el metodo ReadToEnd, como se muestra en el siguiente ejemplo:
Dim EntireFile as String oRead = oFile.OpenText(c:\sample.txt) EntireFile = oRead.ReadToEnd()

Este ejemplo leer el archivo a una variable EntireFile. Ya que leer el archivo completo puede ser una gran cantidad de datos, asegurese de que la cadena puede manejar dicha cantidad. Un carcter a la vez Si necesita leer el archivo un carcter a la vez, puede usar el metodo Read. Este metodo regresar el carcter entero de cada carcter leido.

Manejo binarios

de

datos

Las clases BinaryWriter y BinaryReader, tal y como podemos anticipar por sus nombres, nos permiten escribir y leer respectivamente, datos binarios en archivos, utilizando los mtodos ya vistos en clases anteriores. Veamos un ejemplo en el Cdigo fuente 418.
' escritura binaria Dim oBin As New BinaryWriter(New FileStream("\pruebas\info.bin", FileMode.CreateNew)) oBin.Write("H"c) oBin.Write("D"c) oBin.Write("U"c) oBin.Close() oBin = Nothing

LECCION 1 Archivos en VB

Pgina 12

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


' lectura binaria Dim oBinLector As BinaryReader oBinLector = New BinaryReader(New FileStream("\pruebas\info.bin", FileMode.Open)) Console.WriteLine("Valor 1 del lector: {0}", oBinLector.ReadChar()) Console.WriteLine("Valor 2 del lector: {0}", oBinLector.ReadChar()) Console.WriteLine("Valor 3 del lector: {0}", oBinLector.ReadChar()) oBinLector.Close() Console.ReadLine() Cdigo fuente 418

Manipulacin de archivos mediante File y FileInfo


Las clases File y FileInfo, proporcionan a travs de sus miembros, el conjunto de operaciones comunes que podemos realizar con archivos en cuanto a su creacin, copia, borrado, etc. La diferencia principal entre ambas radica en que los miembros de File son todos compartidos, con lo cual se facilita en gran medida su uso, al no tener que crear una instancia previa de la clase; mientras que en FileInfo deberemos crear un objeto para poder utilizarla, ya que sus miembros son de instancia. FileInfo dispone de algunos mtodos adicionales que no se encuentran en File. Comenzando por la clase File, los mtodos CreateText( ) y OpenText( ), devuelven respectivamente un objeto StreamWriter y StreamReader, que utilizaremos para escribir y leer en el archivo pasado como parmetro a estos mtodos. Con el mtodo Exists( ), comprobamos si existe un determinado archivo. Veamos un ejemplo en el Cdigo fuente 419.
Dim sNombreFich As String Dim srLector As StreamReader Dim swEscritor As StreamWriter Console.WriteLine("Introducir ruta y archivo") sNombreFich = Console.ReadLine() If File.Exists(sNombreFich) Then srLector = File.OpenText(sNombreFich) Console.WriteLine("El archivo contiene:{0}{1}", _ ControlChars.CrLf, srLector.ReadToEnd()) srLector.Close() Else swEscritor = File.CreateText(sNombreFich) swEscritor.WriteLine("este es") swEscritor.WriteLine("un nuevo archivo") swEscritor.Close() End If Console.WriteLine("Proceso finalizado") Console.ReadLine()

Para obtener los atributos de un archivo, disponemos del mtodo GetAttributes( ), al que pasamos la ruta de un archivo, y devuelve un valor de la enumeracin FileAttributes con la informacin sobre los atributos. En el caso de que al intentar acceder a un archivo, este no exista, se producir una excepcin de tipo FileNotFoundException, que podemos tratar en una estructura de manejo de excepciones. Ver el Cdigo fuente 420.

LECCION 1 Archivos en VB

Pgina 13

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Dim sNombreFich As String Dim oAtributos As FileAttributes Try Console.WriteLine("Introducir ruta y archivo") sNombreFich = Console.ReadLine() oAtributos = File.GetAttributes(sNombreFich) Console.WriteLine("Atributos del archivo: {0}", oAtributos.ToString())

LECCION 1 Archivos en VB

Pgina 14

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Catch oExcep As FileNotFoundException Console.WriteLine("Se ha producido un error {0}{1}", _ ControlChars.CrLf, oExcep.Message) Finally Console.WriteLine("Proceso finalizado") Console.ReadLine() End Try Cdigo fuente 420

Adems de esta excepcin, el espacio de nombres IO proporciona algunas clases de excepcin adicionales para tratar otras diversas circunstancias de error. Consulte el lector la documentacin de la plataforma referente a IO. Los mtodos Copy( ), Move( ) y Delete( ), nos permiten copiar, mover y borrar respectivamente el nombre de archivo que pasemos como parmetro. El mtodo GetCreationTime( ) nos devuelve un tipo Date con la fecha de creacin del archivo. Por otro lado, si queremos obtener informacin adicional sobre un archivo, como su nombre, extensin, ruta, etc., instanciaremos un objeto FileInfo( ), pasando al constructor una cadena con el nombre del archivo, y utilizaremos algunas de sus propiedades como Name, Extensin, DirectoryName. Veamos una muestra de todo esto en el Cdigo fuente 421.
Dim sNombreFich As String Dim iOperacion As Integer Dim oFInfo As FileInfo Console.WriteLine("Introducir ruta y archivo") sNombreFich = Console.ReadLine() Console.WriteLine("Fecha creacin archivo: {0}", _ File.GetCreationTime(sNombreFich)) oFInfo = New FileInfo(sNombreFich) Console.WriteLine("Introducir el nmero de operacin a realizar:") Console.WriteLine("1 - Copiar") Console.WriteLine("2 - Mover") Console.WriteLine("3 - Borrar") iOperacion = Console.ReadLine() Select Case iOperacion Case 1 File.Copy(sNombreFich, "\pruebas\distinto" & oFInfo.Extension) Case 2 Console.WriteLine("Vamos a mover el archivo {0}", oFInfo.Name) Console.WriteLine("que est en la ruta {0}", oFInfo.DirectoryName) File.Move(sNombreFich, "\pruebas\" & oFInfo.Name) Console.WriteLine("Completado") Console.ReadLine() Case 3 File.Delete(sNombreFich) End Select Cdigo fuente 421

LECCION 1 Archivos en VB

Pgina 15

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Manipulacin DirectoryInfo

de

archivos

mediante

Directory

Las clases Directory y DirectoryInfo contienen mtodos y propiedades para crear, borrar, copiar y mover directorios, as como otra serie de tareas para su manejo y obtencin de informacin. Al igual que suceda con las clases del anterior apartado, los miembros de Directory son compartidos, mientras que los de DirectoryInfo son de instancia; esta es su principal diferencia. En el ejemplo del Cdigo fuente 422, el mtodo Exists( ) comprueba la existencia de un directorio, y en caso afirmativo, obtenemos su ltima fecha de uso mediante GetLastAccessTime( ). Seguidamente obtenemos un array String con su lista de archivos mediante GetFiles( ), y creamos un subdirectorio de respaldo con CreateSubdirectory( ). En caso de que el directorio no exista, lo creamos con CreateDirectory( ).

Dim sNombreDir As String Dim Archivos() As String Dim Archivo As String Dim oDirInfo As DirectoryInfo Console.WriteLine("Introducir un nombre de directorio") sNombreDir = Console.ReadLine() If Directory.Exists(sNombreDir) Then Console.WriteLine("Fecha ltimo acceso: {0}", _ Directory.GetLastAccessTime(sNombreDir)) Console.WriteLine("Archivos del directorio {0}", sNombreDir) Archivos = Directory.GetFiles(sNombreDir) For Each Archivo In Archivos Console.WriteLine(Archivo) Next Else oDirInfo = New DirectoryInfo(sNombreDir) oDirInfo.CreateSubdirectory("bak") Directory.CreateDirectory(sNombreDir) Console.WriteLine("No exista el directorio, se acaba de crear") End If Cdigo fuente 422

Para obtener el directorio actual de ejecucin, disponemos del mtodo GetCurrentDirectory( ), mientras que si queremos subir al directorio de nivel superior, tenemos el mtodo GetParent( ), que devuelve un tipo DirectoryInfo, con el que podemos, por ejemplo, mostrar su nombre completo mediante la propiedad FullName, y fecha de creacin con CreationTime. Veamos el Cdigo fuente 423.

LECCION 1 Archivos en VB

Pgina 16

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Dim sNombreDir As String Dim oDirInfo As DirectoryInfo ' obtenemos el directorio actual de ejecucin sNombreDir = Directory.GetCurrentDirectory() Console.WriteLine("Directorio actual: {0}", sNombreDir) ' obtenemos el directorio padre del actual, ' y mostramos informacin de dicha directorio oDirInfo = Directory.GetParent(sNombreDir) Console.WriteLine("Directorio padre y fecha de creacin {0}{1}{2}{3}", _ ControlChars.CrLf, oDirInfo.FullName, _ ControlChars.CrLf, oDirInfo.CreationTime) Cdigo fuente 423

En el siguiente ejemplo, el mtodo GetDirectories( ) devuelve un array de cadenas, con los nombres de los subdirectorios que se encuentran dentro del directorio pasado como parmetro a este mtodo. A continuacin, mediante el mtodo Move( ), cambiamos de lugar un directorio; con Delete( ) borramos otro de los directorios. Observe el lector, cmo utilizando de forma combinada CType( ), Directory.GetFiles( ), y un elemento del array que contiene la lista de directorios, creamos una expresin que nos permite averiguar, si en un determinado directorio hay o no archivos. Ver el Cdigo fuente 424.
Dim sNombreDir As String Dim oDirInfo As DirectoryInfo Dim sDirectorios() As String Dim sDirectorio As String Console.WriteLine("Introducir un nombre de directorio") sNombreDir = Console.ReadLine() ' obtener directorios del directorio especificado sDirectorios = Directory.GetDirectories(sNombreDir) ' comprobar que el directorio contiene a su vez ' varios directorios; en caso negativo, finalizar If Not (sDirectorios.Length > 1) Then Console.WriteLine("El directorio especificado debe contener al menos dos subdirectorios") Console.ReadLine() Exit Sub End If ' mostrar nombres de directorios For Each sDirectorio In sDirectorios Console.WriteLine(sDirectorio) Next ' mover uno de los directorios a otra ubicacin del disco actual Directory.Move(sDirectorios(0), "\temp\BIS") ' borrar otro de los directorios; ' el directorio a borrar debe estar vaco; ' comprobar con la siguiente expresin si dicho ' directorio contiene o no archivos If (CType(Directory.GetFiles(sDirectorios(1)), String()).Length() > 0) Then Console.WriteLine("No se puede borrar el directorio: {0} - " & _ "contiene archivos", sDirectorios(1))

LECCION 1 Archivos en VB

Pgina 17

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Else Directory.Delete(sDirectorios(1)) End If Console.WriteLine("Completado") Console.ReadLine()

Cdigo fuente 424

La clase Path
Esta clase nos proporciona un conjunto de campos y mtodos compartidos, para la obtencin de informacin y manipulacin de rutas de archivos. El Cdigo fuente 425 muestra un ejemplo en el que, una vez introducido un directorio, se muestra la informacin de cada uno de sus archivos, en lo que respecta a los mtodos de esta clase.

Console.WriteLine("Introducir nombre de directorio") Dim sDirectorio As String sDirectorio = Console.ReadLine() Dim sArchivos() As String sArchivos = Directory.GetFiles(sDirectorio) Console.WriteLine("Datos sobre archivos obtenidos del objeto Path") Console.WriteLine("==============================================") Dim sArchivo As String For Each sArchivo In sArchivos Console.WriteLine("GetDirectoryName() {0}", Path.GetDirectoryName(sArchivo)) Console.WriteLine("GetExtension() {0}", Path.GetExtension(sArchivo)) Console.WriteLine("GetFileName() {0}", Path.GetFileName(sArchivo)) Console.WriteLine("GetFileNameWithoutExtension() {0}", Path.GetFileNameWithoutExtension(sArchivo)) Console.WriteLine("GetFullPath() {0}", Path.GetFullPath(sArchivo)) Console.WriteLine() Next Console.ReadLine() Cdigo fuente 425

Monitorizacin del FileSystemWatcher

sistema

de

archivos

con

Esta clase contiene los mecanismos necesarios, que nos van a permitir la creacin de objetos que acten como observadores de los sucesos que ocurran en el sistema de archivos de un equipo local o remoto en cuanto a la creacin, borrado, modificacin, etc., de archivos y directorios. La creacin de este proceso de vigilancia podemos dividirla en dos partes: instanciacin y configuracin del propio objeto FileSystemWatcher; y la escritura de los procedimientos manipuladores de los diversos eventos que pueden ocurrir sobre los archivos y directorios.

LECCION 1 Archivos en VB

Pgina 18

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Para facilitar la escritura de los manipuladores de evento, podemos declarar una variable de esta clase a nivel de mdulo, con la palabra clave WithEvents. Ver Cdigo fuente 426.

Module Module1 Private WithEvents oFSW As FileSystemWatcher Sub Main() '.... '.... Cdigo fuente 426

Declarado el objeto FileSystemWatcher, lo instanciaremos y asignaremos valor a las propiedades mencionadas a continuacin, que nos permitirn configurar el modo de observacin que realizar este objeto sobre los archivos. Path. Tipo String. Contiene la ruta de la unidad de disco sobre la que se efectuar la monitorizacin. Filter. Tipo String. Contiene el tipo de fichero que se va a observar, admitiendo los caracteres comodn; por ejemplo: *.*, *.txt. IncludeSubdirectories. Tipo Boolean. Establece si se van a monitorizar los subdirectorios de la ruta especificada en la propiedad Path. El valor True incluye los subdirectorio, mientras que False no los incluye. EnableRaisingEvents. Tipo Boolean. Activa el proceso de observacin sobre el sistema de archivos, teniendo en cuenta la configuracin establecida en las dems propiedades mencionadas arriba. El valor True pone en marcha el mecanismo de observacin, mientras que el valor False lo detiene. Veamos un ejemplo de estas propiedades en el Cdigo fuente 427.
Sub Main() ' instanciar objeto FileSystemWatcher oFSW = New FileSystemWatcher() ' configurar objeto oFSW.Path = "C:\pruebas" oFSW.Filter = "*.txt" oFSW.IncludeSubdirectories = True ' activar oFSW.EnableRaisingEvents = True ' mientras que no pulsemos S, el objeto inspeccionar ' el sistema de archivos del equipo While (Console.ReadLine() <> "S") End While End Sub Cdigo fuente 427

LECCION 1 Archivos en VB

Pgina 19

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Para completar este proceso que estamos describiendo, slo nos queda escribir los procedimientos que van a ejecutarse cuando se realice la creacin, borrado, modificacin, etc., de un archivo. Puesto que hemos declarado la variable FileSystemWatcher a nivel del mdulo de cdigo, seleccionaremos dicha variable en la lista desplegable Nombre de clase, del editor de cdigo. Seguidamente, abriremos la lista Nombre de mtodo, tambin del editor; seleccionando el evento a codificar. Las anteriores acciones, crearn el procedimiento de evento correspondiente, pero vaco, por lo que tendremos que escribir el cdigo que queramos ejecutar en respuesta a tal evento. La lista de parmetros de este procedimiento consiste en un tipo Object, que contiene la referencia al objeto FileSystemWatcher que origin el evento; y un tipo FileSystemEventArgs, que contiene informacin adicional sobre el evento ocurrido, como el nombre y ruta del archivo. El Cdigo fuente 428 muestra los procedimientos de evento que se ejecutarn cuando se cree o borre un archivo.
' al crear un fichero se ejecutar este procedimiento de evento Public Sub oFSW_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles oFSW.Created Console.WriteLine("Se ha creado un archivo : {0}", e.FullPath) End Sub ' al borrar un fichero se ejecutar este procedimiento de evento Public Sub oFSW_Deleted(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles oFSW.Deleted Console.WriteLine("Se ha producido el borrado: {0}", e.FullPath) End Sub Cdigo fuente 428

Ajuste preciso de filtros para el monitor de archivos


Si queremos realizar un filtro ms puntual, por ejemplo, cuando hagamos cambios sobre los archivos a monitorizar, la clase FileSystemWatcher dispone de la propiedad NotifyFilter, que contiene una enumeracin de tipo NotifyFilters, cuyos valores podemos combinar para que slo se detecten los cambios al modificar el tamao y/o la ltima escritura sobre un archivo. La Figura 216 muestra un ejemplo del uso de esta propiedad.

LECCION 1 Archivos en VB

Pgina 20

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Figura 216. Uso de filtros de notificacin para un objeto FileSystemWatcher.

Establecer el procedimiento de evento con AddHandler


Adems de crear los procedimientos de evento de la forma descrita en apartados anteriores, podemos emplear una tcnica ms flexible, que nos permite conectar los eventos del objeto con sus manipuladores, utilizando la palabra clave AddHandler. El Cdigo fuente 429 muestra un ejemplo de esta situacin.
Sub Main() ' instanciar objeto FileSystemWatcher Dim oFSW As New FileSystemWatcher() ' configurar objeto oFSW.Path = "C:\pruebas" oFSW.Filter = "*.txt" oFSW.IncludeSubdirectories = True ' conectamos manualmente ' con los procedimientos AddHandler oFSW.Created, AddHandler oFSW.Changed, los eventos del objeto manipuladores de esos eventos AddressOf oFSW_Created AddressOf CambioProducido

' activar oFSW.EnableRaisingEvents = True ' mientras que no pulsemos S, el objeto inspeccionar ' el sistema de archivos del equipo While (Console.ReadLine() <> "S") End While End Sub Public Sub oFSW_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Console.WriteLine("Se ha creado un archivo: {0}", e.FullPath) End Sub Public Sub CambioProducido(ByVal emisor As Object, ByVal argumentos As FileSystemEventArgs) Console.WriteLine("Se ha cambiado el archivo: {0}", argumentos.FullPath) End Sub Cdigo fuente 429

Observe el lector, que para el nombre del procedimiento manipulador de evento, podemos emplear tanto el formato que utiliza el editor de cdigo, como otro nombre cualquiera. Para el evento de creacin de archivo hemos utilizado el formato que usa tambin el editor, consistente en poner el nombre de objeto, guin bajo, y nombre de evento: oFSW_Created( ). Sin embargo para el evento de modificacin de archivo hemos utilizado un nombre que no se ajusta en absoluto al formato del editor: CambioProducido( ).

LECCION 1 Archivos en VB

Pgina 21

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Consideraciones sobre la ruta de archivos


El modo en que asignemos a la propiedad Path del objeto FileSystemWatcher, la cadena con la ruta a inspeccionar, influir en el modo en que recuperemos la informacin del evento en el procedimiento manipulador correspondiente. Si asignamos a Path la ruta, sin especificar la unidad de disco, al intentar utilizar la propiedad FullName del objeto FileSystemEventArgs, en el procedimiento de evento, se producir un error. Ver el Cdigo fuente 430.

Sub Main() '.... oFSW.Path = "\pruebas" '.... End Sub Public Sub oFSW_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) ' al intentar utilizar la propiedad FullPath ocurrir un error Console.WriteLine("Se ha creado un archivo: {0}", e.FullPath) End Sub Cdigo fuente 430

Para que en el anterior ejemplo no se produzca un error, debemos indicar tambin la letra de unidad correspondiente al asignar la ruta a Path. Ver Cdigo fuente 431.

oFSW.Path = "C:\pruebas" Cdigo fuente 431

Deteccin con espera, de eventos producidos sobre archivos


El mtodo WaitForChanged( ) de la clase FileSystemWatcher, devuelve un objeto de tipo WaitForChangedResult, el cual efecta una parada en la ejecucin, quedando a la espera de que ocurra un determinado evento sobre el sistema de archivos. Una vez que dicho evento se produzca, se continuar la ejecucin del programa. El tipo de evento que ponemos a la espera, lo definimos pasando como parmetro al mtodo WaitForChanged( ), un valor de la enumeracin WatcherChangeTypes. Veamos un ejemplo en el Cdigo fuente 432.

Dim oFSW As New FileSystemWatcher() '.... ' crear un objeto de espera para un evento

LECCION 1 Archivos en VB

Pgina 22

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Dim oWFCR As WaitForChangedResult oWFCR = oFSW.WaitForChanged(WatcherChangeTypes.Created) Console.WriteLine("Se ha creado el archivo: {0}", oWFCR.Name) '.... Cdigo fuente 432

Manipulacin de archivos mediante funciones especficas de Visual Basic


Como comentbamos al comienzo de este tema, en anteriores versiones de VB, el programador tena a su disposicin un grupo de instrucciones como Open, Input, Write, etc., para la lectura y escritura de informacin en archivos. Por cuestiones de compatibilidad y migracin de aplicaciones existentes, estas instrucciones han sido transformadas en funciones, para facilitar su manejo. Funciones como FileOpen( ), para abrir un archivo; FileClose( ), para cerrarlo; LineInput( ), para leer una lnea de texto de un archivo, etc, son las que permiten en la actual versin del lenguaje, realizar las operaciones que anteriormente efectubamos mediante sus correspondientes instrucciones. El Cdigo fuente 433 muestra un pequeo ejemplo, en el que se abre un fichero de texto y se lee su contenido utilizando algunas de estas funciones. Consulte el lector, la documentacin de la plataforma, para una mayor informacin.

Dim iNumArchivo As Integer ' obtener nmero de manipulador de archivo libre iNumArchivo = FreeFile() ' abrir archivo para lectura FileOpen(iNumArchivo, "\cubo\notas.txt", OpenMode.Input) Dim sLinea As String ' recorrer archivo hasta el final While Not EOF(iNumArchivo) ' leer una lnea del archivo sLinea = LineInput(iNumArchivo) Console.WriteLine(sLinea) End While ' cerrar el archivo FileClose(iNumArchivo) Console.ReadLine() Cdigo fuente 433

A pesar de que estas funciones nos permiten la manipulacin de ficheros, debemos tener muy presente que se trata de elementos fundamentalmente proporcionados para compatibilidad con versiones anteriores, por lo que se recomienda que cuando tengamos que hacer cualquier tipo de

LECCION 1 Archivos en VB

Pgina 23

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


operacin con archivos en cuanto a su lectura, escritura, manipulacin, etc., utilicemos las clases del espacio de nombres IO.

LECCION 1 Archivos en VB

Pgina 24

You might also like