Streams y Ficheros
Streams y Ficheros
Streams y Ficheros
ndice Introduccin Marcador no definido. Streams Readers y Writers E/S bsica de archivos Error! 2 5 8
Introduccin
Objetivo
Proporcionar una descripcin de los temas y objetivos del mdulo.
Presentacin
En este mdulo, estudiaremos cmo utilizar tipos que permiten leer y escribir de/a streams de datos y archivos.
El espacio de nombres System.IO contiene tipos que permiten la lectura y la escritura sncrona y asncrona desde/a streams de datos y archivos. Este mdulo trata nicamente sobre operaciones sncronas, ya que las operaciones asncronas estn fuera del alcance de este curso. En este mdulo, aprenderemos a: Sugerencia
Cuando comente una clase concreta, puede mostrar la informacin de clase de System.IO desde la seccin .NET Framework Reference del SDK .NET Framework.
Utilizar objetos Stream para leer y escribir bytes a repositorios de seguridad, como cadenas y archivos. Utilizar objetos BinaryReader y BinaryWriter para leer y escribir tipos primitivos como valores binarios. Utilizar objetos StreamReader y StreamWriter para leer y escribir caracteres en un stream. Utilizar objetos StringReader y StringWriter para leer y escribir caracteres en cadenas. Utilizar objetos Directory y DirectoryInfo para crear, mover y enumerar a travs de directorios y subdirectorios. Utilizar objetos FileSystemWatcher para monitorizar y reaccionar frente a cambios del sistema de archivos. Explicar las principales caractersticas del mecanismo de almacenamiento aislado del .NET Framework.
Streams
Objetivo
Hacer una introduccin a las funciones de la clase Stream y sus subclases.
Stream classes provide a mechanism to read and write bytes from and to a backing store
z
Presentacin
Stream classes inherit from System.IO.Stream CanRead, CanWrite, and CanSeek properties Flush method outputs and clears internal buffers Close method performs an implicit Flush for buffered streams NetworkStream, BufferedStream, MemoryStream, FileStream
Los streams proporcionan una forma de leer y escribir bytes desde y hacia un repositorio de seguridad. Un repositorio de seguridad es un medio de almacenamiento, como un disquete o una memoria.
Los streams proporcionan una forma de leer y escribir bytes desde y hacia un repositorio de seguridad. Un repositorio de seguridad es un medio de almacenamiento, como un disquete o una memoria. Todas las clases que representan streams heredan de la clase Stream. La clase Stream y sus subclases proporcionan una vista genrica de fuentes de datos y repositorios, y protegen al programador de los detalles especficos del sistema operativo y de los dispositivos subyacentes.
Dependiendo de la fuente de datos subyacente o repositorio, los streams pueden soportar nicamente algunas de estas capacidades. Una aplicacin puede realizar una consulta a un stream sobre sus capacidades utilizando las propiedades CanRead, CanWrite y CanSeek. Los mtodos Read y Write leen y escriben datos en forma de bytes. Para los streams que soportan bsqueda, los mtodos Seek y SetLength y las propiedades Position y Length pueden utilizarse para consultar y modificar la posicin y longitud actuales de un stream.
Soporte de buffering
Algunas implementaciones de streams realizan un proceso de buffering local de los datos subyacentes para mejorar el rendimiento. Para estos streams, podemos utilizar el mtodo Flush tanto para eliminar buffers internos como para asegurar que todos los datos se han escrito en la fuente de datos subyacente o el repositorio. Invocar el mtodo Close en un stream realiza un flush de los datos almacenados en buffer. El mtodo Close tambin libera recursos del sistema operativo, como descriptores de archivos, conexiones a redes, o memoria utilizada para algn proceso de buffering interno.
Clase BufferedStream
La clase BufferedStream se utiliza para invocar el proceso de lectura de buffer desde otro stream, y escritura de buffer a otro stream. Un buffer es un bloque de bytes en memoria que se utiliza para almacenar datos en cach, reduciendo as el nmero de llamadas al sistema operativo. Los buffers pueden utilizarse para mejorar el rendimiento de la lectura y escritura. Ninguna otra clase puede heredar de la clase BufferedStream.
Clase MemoryStream
La clase MemoryStream proporciona un mtodo de creacin de streams que utiliza la memoria (en lugar de un disquete o una conexin a red) como repositorio de seguridad. La clase MemoryStream crea un stream desde una matriz de bytes.
Clase FileStream
La clase FileStream se utiliza tanto para leer de archivos como para escribir a ellos. De forma predeterminada, la clase FileStream abre archivos sncronamente, pero tambin proporciona un constructor para abrir archivos asncronamente.
Readers y Writers
Objetivo
Mostrar cmo las clases reader y writer se utilizan para realizar la entrada y salida de datos a streams y cadenas.
Classes that are derived from System.IO.Stream take byte input and output Readers and writers take other types of input and output and read and write them to streams or strings BinaryReader and BinaryWriter read and write primitive types to a stream TextReader and TextWriter are abstract classes that implement read character and write character methods
z
Presentacin
Como hemos mencionado antes, la clase Stream est diseada para extraer e introducir bytes. Podemos utilizar las clases reader y writer tanto para realizar la entrada y salida de datos en streams y cadenas que usan otros tipos.
Derived classes StreamReader and StreamWriter read and write to a stream Derived classes StringReader and StringWriter read and write to a String and StringBuilder respectively
Como se ha comentado en la seccin Streams de este mdulo, la clase Stream est diseada para la entrada/salida de bytes. Podemos utilizar las clases reader y writer para extraer e introducir a streams y cadenas que usan otros tipos. La siguiente tabla describe algunas clases reader y writer utilizadas habitualmente.
Clase BinaryReader y BinaryWriter Descripcin Estas clases leen y escriben tipos como valores binarios en una codificacin especfica a y desde un stream. Las implementaciones de estas clases estn diseadas para introducir y extraer caracteres. Estas clases se derivan de las clases TextReader y TextWriter, que leen sus caracteres desde un stream y escriben sus caracteres a un stream respectivamente. Estas clases tambin derivan de las clases TextReader y TextWriter, pero leen sus caracteres desde una cadena y escriben sus caracteres a una clase StringBuilder respectivamente.
StringReader y StringWriter
Un reader o writer se adjunta a un stream, de modo que los tipos deseados pueden leerse o escribirse fcilmente.
El siguiente ejemplo muestra cmo escribir datos de tipo Integer y leer datos desde un nuevo stream de archivos vaco denominado Test.data. Una vez creado el archivo de datos en el directorio actual, la clase BinaryWriter se utiliza para escribir enteros de 0 a 10 en Test.data. A continuacin, la clase BinaryReader lee el archivo y muestra el contenido del archivo en la consola.
Imports System Imports System.IO Class MyStream Private Const FILE_NAME As String = "Test.data" Shared Sub Main() ' Create the new, empty data file. If (File.Exists(FILE_NAME)) Then Console.WriteLine("{0} already exists!", FILE_NAME) Exit Sub End If Dim fs As New FileStream(FILE_NAME, FileMode.CreateNew) ' Create the writer for data. Dim w As New BinaryWriter(fs) ' Write data to Test.data. Dim i As Integer For i = 0 To 10 w.Write(i) Next w.Close() fs.Close() ' Create the reader for data. fs = New FileStream(FILE_NAME, FileMode.Open, _ FileAccess.Read) Dim r As New BinaryReader(fs) ' Read data from Test.data. For i = 0 To 10 Console.WriteLine(r.ReadInt32()) Next w.Close() End Sub End Class
En el siguiente ejemplo, el cdigo define una cadena y la convierte en una matriz de caracteres. Esta matriz puede leerse utilizando el mtodo StringReader.Read adecuado:
Imports System Imports System.IO Class CharsFromStr Shared Sub Main() ' Create a string to read characters from. Dim str As String = "Some number of characters" ' Size the array to hold all the characters of the ' string, so that they are all accessible. Dim b(24) As Char ' Create a StringReader and attach it to the string. Dim sr As New StringReader(str) ' Read 13 characters from the array that holds ' the string, starting from the first array member. sr.Read(b, 0, 13) ' Display the output. Console.WriteLine(b) ' Close the StringReader. sr.Close() End Sub End Class
System.Text.Encoding
Internamente, el entorno de ejecucin representa todos los caracteres en formato Unicode. Sin embargo, Unicode puede resultar ineficaz en la transferencia de datos a travs de una red, o cuando persiste en un archivo. Para mejorar la eficacia, la biblioteca de clases del .NET Framework proporciona varios tipos derivados de la clase base abstracta System.Text.Encoding. Estas clases pueden codificar y decodificar caracteres Unicode a ASCII, UTF-7, UTF-8, Unicode y otras pginas de cdigo arbitrarias. Cuando construimos un BinaryReader, BinaryWriter, StreamReader o StreamWriter, podemos escoger cualquiera de estas codificaciones. La codificacin predeterminada es UTF-8.
Clase FileStream Clases File y FileInfo Ejemplo de Reading Text Ejemplo de Writing Text Clases Directory y DirectoryInfo FileSystemWatcher Almacenaje aislado
Presentacin
El espacio de nombres System.IO del .NET Framework proporciona varias clases tiles para manipular archivos y directorios.
El espacio de nombres System.IO del .NET Framework proporciona varias clases tiles para manipular archivos y directorios. Importante La poltica de seguridad predeterminada para Internet y las intranets no permite acceder a archivos. Por ello, si escribe cdigo que se descargar desde Internet, no utilice las clases E/S normales de almacenamiento no aislado. Utilice el almacenamiento aislado. Precaucin Cuando se abre un stream de archivos o de redes, slo se realiza una comprobacin de seguridad si el stream se construye. Por ello, debe tener cuidado cuando expone estos streams con cdigo o dominios de aplicaciones de menor confianza.
La clase FileStream
Objetivo
Definir la clase FileStream y los tipos que se utilizan como parmetros en algunos constructores FileStream.
The FileStream class is used for reading from and writing to files FileStream constructor parameter classes
z z z
Presentacin
FileMode enumeration, values include Open, Append, Create FileAccess enumeration, values include Read, ReadWrite, Write FileShare enumeration, values include None, Read, ReadWrite, Write
La clase FileStream se utiliza para leer y escribir de/a archivos. Los tipos FileMode, FileAccess y FileShare se utilizan como parmetros en algunos constructores FileStream.
Dim Dim f f As As New New FileStream(name, FileStream(name, FileMode.Open, FileMode.Open, _ _ FileAccess.Read, FileShare.Read) FileAccess.Read, FileShare.Read) Random access to files by using the Seek method
z z
Specified by byte offset Offset is relative to seek reference point: Begin, Current, End
La clase FileStream se utiliza para leer y escribir de/a archivos. Los tipos FileMode, FileAccess y FileShare se utilizan como parmetros en algunos constructores FileStream.
La enumeracin FileAccess
La enumeracin FileAccess define constantes para en acceso en modo lectura, escritura o lectura/escritura a un archivo. Esta enumeracin tiene un atributo FlagsAttribute que permite una combinacin de bits de sus valores miembro. Se especifica un parmetro FileAccess en muchos de los constructores para File, FileInfo y FileStream, y en otros constructores de clases en los que es importante controlar el tipo de acceso de los usuarios a un determinado archivo.
10
La enumeracin FileShare
La enumeracin FileShare contiene constantes para controlar el tipo de acceso que otros objetos FileStream pueden tener al mismo archivo. Esta enumeracin tiene un atributo FlagsAttribute que permite una combinacin de bits de sus valores miembro. La enumeracin FileShare se utiliza tpicamente para definir si varios procesos pueden leer simultneamente desde el mismo archivo. Por ejemplo, si se abre un archivo y est especificado FileShare.Read, otros usuarios podrn abrir el archivo para leerlo pero no para escribir. FileShare.Write especifica que otros usuarios pueden escribir simultneamente en el mismo archivo. FileShare.None declina toda comparticin del archivo. En el siguiente ejemplo, un constructor FileStream abre un archivo existente para acceder en modo lectura y permite a otros usuarios leer el archivo simultneamente:
Dim f As New FileStream(name, FileMode.Open, _ FileAccess.Read, FileShare.Read)
11
Crear, copiar, eliminar, mover y abrir archivos Crear, copiar, eliminar, mover y abrir archivos Utilizando un objeto FileInfo se pueden eliminar algunas comprobaciones de seguridad Asignar a aStream un archivo recin creado denominado MyFile.txt en el directorio actual
Presentacin
Las clases File y FileInfo son clases tiles con mtodos que se utilizan principalmente para crear, copiar, eliminar, mover y abrir archivos.
Ejemplo:
z
Las clases File y FileInfo son clases tiles que contienen mtodos que se utilizan principalmente para crear, copiar, eliminar, mover y abrir archivos. Todos los mtodos de la clase File son compartidos y, por tanto, pueden invocarse sin crear una instancia de la clase. La clase FileInfo contiene nicamente mtodos de instancia. Los mtodos compartidos de la clase File realizan comprobaciones de seguridad en todos los mtodos. Si vamos a reutilizar un objeto varias veces, pensemos en utilizar en su lugar el mtodo de instancia de FileInfo correspondiente. De este modo, se minimizarn el nmero de comprobaciones de seguridad. Por ejemplo, para crear un archivo denominado MyFile.txt y devolver un objeto FileStream, utilice el siguiente cdigo:
Dim aStream As FileStream = File.Create("MyFile.txt")
Para crear un archivo denominado MyFile.txt y devolver un objeto StreamWriter, utilice el siguiente cdigo:
Dim sw As StreamWriter = File.CreateText("MyFile.txt")
Para abrir un archivo denominado MyFile.txt y devolver un objeto StreamReader, utilice el siguiente cdigo:
Dim sr As StreamReader = File.OpenText("MyFile.txt")
12
Presentacin
En el siguiente ejemplo, leeremos un archivo completo y se nos notificar cuando se detecte el final del archivo.
'... '... Dim Dim sr sr As As StreamReader StreamReader = = File.OpenText(FILE_NAME) File.OpenText(FILE_NAME) Dim Line As String = sr.ReadLine() Dim Line As String = sr.ReadLine() While While Not(Line Not(Line Is Is Nothing) Nothing) Console.WriteLine(Line) Console.WriteLine(Line) Line Line = = sr.ReadLine() sr.ReadLine() End While End While Console.WriteLine Console.WriteLine ( (_ _ "The end of the stream "The end of the stream has has been been reached.") reached.") sr.Close() sr.Close() '... '...
En el siguiente ejemplo de lectura de texto, leeremos un archivo completo y se nos notificar cuando se detecte el final del archivo.
13
Shared Sub Main() ' Create the new, empty data file. If (File.Exists(FILE_NAME) = False) Then Console.WriteLine("{0} does not exist!", FILE_NAME) Exit Sub End If Dim sr As StreamReader = File.OpenText(FILE_NAME) Dim Line As String = sr.ReadLine() While Not(Line Is Nothing) Console.WriteLine(Line) Line = sr.ReadLine() End While Console.WriteLine( _ "The end of the stream has been reached.") sr.Close() End Sub End Class
Este cdigo crea un objeto StreamReader que apunta a un archivo denominado MyFile.txt utilizando una llamada a File.OpenText. StreamReader.ReadLine devuelve cada lnea como una cadena. Cuando no hay ms caracteres para leer, se muestra un mensaje a tal efecto, y el stream se cierra.
14
Presentacin
Create a file Write a string, an integer, and a floating point number Close the file
Este ejemplo crea un nuevo archivo de texto denominado MyFile.txt, escribe una cadena, un entero y un nmero de coma flotante en l y, finalmente, cierra el archivo.
'... '... Dim Dim sw sw As As StreamWriter StreamWriter = =_ _ File.CreateText("MyFile.txt") File.CreateText("MyFile.txt") sw.WriteLine("This sw.WriteLine("This is is my my file") file") sw.WriteLine( _ sw.WriteLine( _ "I "I can can write write ints ints {0} {0} or or floats floats {1}", {1}", 1, 1, 4.2) 4.2) sw.Close() sw.Close() '... '...
El siguiente ejemplo crea un nuevo archivo de texto denominado MyFile.txt, escribe una cadena, entero y un nmero de coma flotante en l y, finalmente, cierra el archivo.
Imports System Imports System.IO Class TextToFile Private Const FILE_NAME As String = "MyFile.txt" Shared Sub Main() If (File.Exists(FILE_NAME)) Then Console.WriteLine("{0} already exists!", FILE_NAME) Exit Sub End If Dim sw As StreamWriter = File.CreateText("MyFile.txt") sw.WriteLine("This is my file") sw.WriteLine( _ "I can write ints {0} or floats {1}, and so on.", 1, 4.2) sw.Close() End Sub End Class
15
Crear, mover y enumerar a travs de directorios y subdirectorios Crear, navegar y enumerar a travs de directorios y subdirectorios Poder eliminar algunas comprobaciones de seguridad cuando se reutiliza un objeto Enumerar a travs del dirctorio actual
Presentacin
Las clases Directory y DirectoryInfo exponen rutinas para crear, mover y enumerar a travs de directorios y subdirectorios.
Ejemplo:
z
Dim Dim dir dir As As New New DirectoryInfo(".") DirectoryInfo(".") Dim f As FileInfo, Dim f As FileInfo, name name As As String String For Each f in dir.GetFiles("*.vb") For Each f in dir.GetFiles("*.vb") name name = = f.FullName f.FullName Next Next
Las clases Directory y DirectoryInfo contienen rutinas para crear, mover y enumerar a travs de directorios y subdirectorios. Todos los mtodos de la clase Directory son compartidos y, por tanto, pueden invocarse sin crear una instancia de un directorio. La clase DirectoryInfo contiene todos los mtodos de instancia. Los mtodos compartidos de la clase Directory realizan una comprobacin de seguridad en todos los mtodos. Si vamos a volver a utilizar un objeto varias veces, pensemos en utilizar en su lugar el mtodo de instancia de DirectoryInfo correspondiente. De este modo, se minimizar el nmero de comprobaciones de seguridad. El siguiente ejemplo muestra el uso de la clase DirectoryInfo para crear un listado de un directorio:
16
En el ejemplo anterior, el objeto DirectoryInfo es el directorio actual, indicado por ("."). El cdigo lista los nombres de todos los archivos del directorio actual con extensin .vb, junto con su tamao de archivo y fecha de creacin. Si hay archivos .vb en el subdirectorio \Bin de la unidad C, la salida de este cdigo es la siguiente:
953 664 403 7/20/2000 10:42 AM 7/27/2000 3:11 PM 8/8/2000 10:25 AM C:\Bin\paramatt.vb C:\Bin\tst.vb C:\Bin\dirlist.vb
Rutas
Utilice la clase Path para procesar cadenas de directorios de modo multiplataforma. Los miembros de la clase Path permiten realizar rpida y fcilmente las operaciones ms habituales, como averiguar si una extensin de archivo forma parte de una ruta, y combinar dos cadenas en un nombre de ruta.
17
FileSystemWatcher
Objetivo
Explicar cmo puede utilizarse el componente FileSystemWatcher para monitorizar y responder a cambios en un sistema de archivos.
FileSystemWatcher se utiliza para monitorizar un sistema de archivos Crear un objeto FileSystemWatcher Configurar para invocar un mtodo callback cuando se detecten cambios
Presentacin
Utilizamos el componente FileSystemWatcher para monitorizar un sistema de archivos y para reaccionar cuando se producen cambios en ese sistema de archivos.
watcher.Path watcher.Path = = args(0) args(0) watcher.Filter watcher.Filter = = "*.txt" "*.txt" watcher.NotifyFilter watcher.NotifyFilter = = NotifyFilters.FileName NotifyFilters.FileName AddHandler watcher.Renamed, AddHandler watcher.Renamed, AddressOf AddressOf OnRenamed OnRenamed
Empezar a controlar si se producen cambios en el sistema de archivos Capturar eventos en el mtodo callback
Shared Shared Sub Sub OnRenamed(ByVal OnRenamed(ByVal s s As As object, object, ByVal ByVal e e As As RenamedEventArgs) RenamedEventArgs) Console.WriteLine("File: {0} renamed to {1}", Console.WriteLine("File: {0} renamed to {1}", _ _ e.OldFullPath, e.OldFullPath, e.FullPath) e.FullPath) End Sub End Sub
Utilizamos el componente FileSystemWatcher para monitorizar un sistema de archivos y para reaccionar cuando se producen cambios en dicho sistema. Utilizando el componente FileSystemWatcher, podemos lanzar rpida y fcilmente procesos de negocio cuando se creen, modifiquen o eliminen directorios o archivos especficos. Por ejemplo, si un grupo de usuarios est colaborando en el mismo documento y ese documento est almacenado en el directorio compartido de un servidor, podemos utilizar fcilmente el componente FileSystemWatcher para programar su aplicacin para monitorizar cambios. Cuando se detecte un cambio, el componente puede ejecutar un proceso que avise a cada usuario a travs del correo electrnico. Podemos configurar el componente para monitorizar un directorio completo y su contenido o para buscar nicamente un archivo especfico o un conjunto de archivos de un determinado directorio. Para monitorizar cambios en todos los archivos, estableceremos la propiedad Filter en una cadena vaca (""). Para monitorizar cambios en un archivo especfico, estableceremos la propiedad Filter en el nombre del archivo. Por ejemplo, para monitorizar cambios en el archivo MyDoc.txt, estableceremos la propiedad Filter en "MyDoc.txt". Tambin podemos monitorizar cambios en todos los archivos de un determinado tipo. Por ejemplo, para monitorizar cambios en todos los archivos de texto, estableceremos la propiedad Filter en "*.txt". Nota Los archivos ocultos no se ignoran. Existen varios tipos de cambios que podemos monitorizar en un directorio o en un archivo. Por ejemplo, podemos buscar cambios en atributos (Attributes), en
18
la fecha y hora (LastWrite), o en el tamao (Size) de archivos o directorios. Para ello, estableceremos la propiedad FileSystemWatcher.NotifyFilter en uno de los valores NotifyFilters. Si deseamos obtener ms informacin sobre los tipos de cambios que podemos monitorizar, consultar NotifyFilters en el kit de desarrollo de software (SDK) del .NET Framework. Podemos monitorizar el cambio de nombre o la eliminacin y creacin de archivos o directorios. Por ejemplo, para monitorizar el cambio de nombre de archivos de texto, estableceremos la propiedad Filter en "*.txt" e invocaremos uno de los mtodos WaitForChanged con el valor WatcherChangeTypes en Renamed.
19
20
21
Almacenamiento aislado
Objetivo
Presentar el almacenamiento aislado y sus posibles usos.
El almacenamiento aislado ofrece formas estandarizadas de asociar aplicaciones a datos guardados Las aplicaciones Web parcialmente confiadas requieren:
z z
Presentacin
Para algunas aplicaciones, como aplicaciones descargadas de la Web y cdigo que puede provenir de fuentes sin confianza, el sistema de archivos bsico no ofrece el aislamiento y la seguridad necesarios.
Aislamiento de sus datos de los datos de otras aplicaciones Acceso seguro al sistema de archivos de un equipo
NotInheritable NotInheritable Public Public Class Class IsolatedStorageFile IsolatedStorageFile Inherits Inherits IsolatedStorage IsolatedStorage Implements Implements IDisposable IDisposable
Public Public Class Class IsolatedStorageFileStream IsolatedStorageFileStream Inherits Inherits FileStream FileStream
La funcionalidad E/S bsica de archivos, que se encuentra en la raz System.IO, ofrece la capacidad de acceder, almacenar y manipular datos almacenados en sistemas de archivos jerrquicos cuyos archivos estn referenciados mediante rutas exclusivas. Para algunas aplicaciones, como las aplicaciones descargadas de la Web y cdigo que puede provenir de fuentes sin confianza, el sistema bsico de archivos no ofrece el aislamiento y seguridad necesarios. El almacenamiento aislado es un mecanismo de almacenamiento de datos que proporciona aislamiento y seguridad definiendo formas estandarizadas de asociar cdigo a los datos almacenados.
Aislamiento
Cuando una aplicacin almacena datos en un archivo, debe elegirse cuidadosamente tanto el nombre del archivo como la ubicacin del almacenamiento para minimizar la posibilidad de que la ubicacin del almacenamiento sea conocida por otra aplicacin y, por tanto, ser vulnerable a la corrupcin. El almacenamiento aislado ofrece los medios para gestionar archivos de aplicaciones descargadas de la Web y minimizar posibles conflictos de almacenamiento.
22
cuales restringen el acceso de los usuarios a los archivos. Sin embargo, este planteamiento a menudo no es factible con aplicaciones Web, ya que requiere que los administradores configuren ACLs en todos los sistemas en que se ejecutar cada aplicacin.