Professional Documents
Culture Documents
LECCION 1 Archivos en VB
Pgina 1
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.
LECCION 1 Archivos en VB
Pgina 2
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 .
LECCION 1 Archivos en VB
Pgina 3
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.
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
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.
LECCION 1 Archivos en VB
Pgina 5
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
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
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.
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.
LECCION 1 Archivos en VB
Pgina 8
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
' 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.
LECCION 1 Archivos en VB
Pgina 10
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
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
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
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
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
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
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
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
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
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
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
LECCION 1 Archivos en VB
Pgina 20
' 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
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.
Dim oFSW As New FileSystemWatcher() '.... ' crear un objeto de espera para un evento
LECCION 1 Archivos en VB
Pgina 22
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
LECCION 1 Archivos en VB
Pgina 24