Você está na página 1de 9

c  


  
El manejo de archivos en la plataforma .NET se logra mediante la clase Stream que
representa un flujo de información (Un archivo es considerado un flujo de datos, al igual
que los datos transferidos de un dispositivo a otro, o los datos transferidos por la red
mediante TCP/IP).

La clase Stream, es una clase abstracta, por lo que no es posible utilizarla directamente ya
que no se puede crear instancias. Lo que se debe hacer es utilizar una de sus clases
derivadas que se especializan en el tratamiento de streams para diferentes destinos como
por ejemplo FileStream (para el manejo de archivos), Memorystream (para el manejo de
datos en memoria), etc.

La primera opción para escribir y/o leer datos de una archivo de texto es utilizar la clase
FileStream. Esta clase se encuentra en el namespace System.IO y es una clase derivada de
la clase Stream.

El FileStream actúa como un intermediario entre el sistema de archivos y nuestra


aplicación, permitiendo realizar de una manera limpia y sencilla operaciones de escritura y
lectura en archivos. Para utilizar el FileStream, lo primero que se debe hacer es crear una
instancia que apunte al archivo deseado. Para esto se tiene la opción de utilizar alguno de
los constructores ofrecidos, tal y como se muestra a continuación:

Como se ve en la figura anterior, es un constructor bastante tedioso de utilizar porque


recibe una cantidad considerable de parámetros. Para contrarestar esto, tenemos la
posibilidad de utilizar alguno de los métodos ofrecidos por la clase utilitaria File, que nos
permite obtener un FileStream con parámetros específicos de acuerdo al método utilizado
para obtenerlo. A continuación se muestra un ejemplo:

En el ejemplo anterior se utilizó el método Create el cual crea el archivo en la ruta


especificada y en caso de que el archivo exista, es sobrescrito. Estos métodos ofrecidos por
la clase File, facilitan el desarrollo de aplicaciones con manejo de archivos y permite una
mejor lectura de código.

Para escribir datos en un archivo de texto, se utilizan los métodos Write y WriteByte. El
primero recibe como parámetro un vector de bytes que representa la información a
almacenar, mientras el segundo recibe como parámetro un solo byte para ser escrito. Elegir
cual de los dos métodos utilizar depende del escenario, ya que cuando se va a escribir gran
cantidad de información, no es recomendable escribir byte a byte porque se ejecutaría
muchas veces el mismo ciclo sino que por el contrario, es conveniente escribir varios bytes
a la vez.

A continuación se muestra un ejemplo de la operación de escritura con ambos métodos:

Se puede observar como se utiliza la clase Encoding para formatear la cadena en UTF8 y
obtener el array de bytes que se debe escribir en el archivo. De la misma manera se puede
codificar el texto a escribir en otro formato como por ejemplo ASCII, Unicode, etc.

Es importante mencionar que todo stream se debe cerrar al finalizar la operación que se
realiza sobre el, ya que de lo contrario el archivo quedaría bloqueado y no se liberarían
recursos del sistema operativo. Adicionalmente, el método Flush, se utiliza para indicarle a
la clase FileStream, que escriba en el archivo físico lo que se ha escrito con el método
WriteByte o con el método Write hasta el momento ya que de lo contrario, dichos cambios
se verían reflejados únicamente cuando se cierre el Stream. Este método seria útil cuando
queremos que se escriba el texto en el archivo y no deseamos cerrar el Stream porque
necesitamos seguir haciendo operaciones de escritura, además de ser una buena práctica
siempre utilizarlo aun cuando parezca ser innecesario.

La implementación de la misma funcionalidad con el otro método, seria como se muestra a


continuación.
Como se ve en el ejemplo anterior, con estos métodos, el programador tiene un control muy
preciso sobre la información que desea escribir en el archivo, tanto, que hasta puede llegar
a ser engorroso en algunas ocasiones.

Afortunadamente, la plataforma .NET ofrece otras maneras de administrar Streams para


hacerle la vida más fácil al desarrollador. Una de esas maneras es utilizar la clase
StreamWriter para escribir en archivos y StreamReader para leer desde archivos. Es
necesario tener en cuenta que estas clases están orientadas a obtener caracteres como salida
a diferencia de las clases que heredan de Stream que están orientadas a obtener bytes.

Con la clase StreamWriter, solo nos debemos preocupar por utilizar el método Write o
WriteLine para escribir datos en un archivo de texto. Estos métodos reciben tipos de datos
nativos del lenguaje como por ejemplo int, bool, decimal, float, string, char, etc. Y utiliza el
codificador indicado cuando se instancia la clase para codificar los caracteres de salida al
archivo de texto. En caso de utilizar un constructor que no especifique algún Encoding, por
defecto esta clase opera con el UTF8.

Como se ve en el ejemplo anterior, las líneas de código son mucho mas sencillas que las
vistas en el ejemplo del FileStream. Esto es porque la clase StreamWriter es una clase
especializadas para el trabajo de Stream hacia archivos de texto y nos evita el trabajo de
tener que obtener la representación en bytes del valor que queramos escribir.

La diferencia entre el método Write y WriteLine, es que el segundo inserta un salto de línea
al final de los datos ingresados, haciendo que la próxima vez que se quiera insertar, se hará
en la siguiente línea.

Aunque la clase StreamWriter no hereda de la clase Stream, si utiliza en su implementación


un Stream en el cual escribe o lee secuencias de caracteres. Por eso, esta clase en su
interior, se encarga de crear y utilizar el Stream necesario para apuntar al archivo de texto
representado por la ruta que se utilizo en el constructor del ejemplo. Sin embargo, esta clase
también tiene otro constructor donde se le puede pasar un Stream que tengamos creado en
lugar de la ruta, como se ve a continuación:

El complemento del objeto StreamWriter es el objeto StreamReader, cuyo principal


objetivo es facilitarnos las tareas de lectura de cadenas de caracteres. Con este objeto, nos
podemos despreocupar de esas tareas de bajo nivel para poder obtener un código mucho
mas limpio y fácilmente legible.
En el ejemplo se ve como fácilmente se puede leer información de un archivo de texto
utilizando el método ReadLine del objeto StreamReader. Este método, simplemente lee la
línea siguiente teniendo en cuenta la posición actual del puntero del archivo.

Es importante aclarar que utilizando los streams vistos hasta el momento se pueden leer y
escribir en archivos de texto cadenas de caracteres, es decir, texto plano. Esto implica que
la información escrita en los archivos podrá ser vista y entendida por cualquier persona, ya
que se guarda tal y como se encuentra en un principio.

Lo anterior puede llegar a ser un problema en los casos en que se elige utilizar archivos de
texto como repositorio de datos de una aplicación (aunque esto es poco recomendable,
habrán casos en los pueda llegar a ser necesario), y digo que es un problema porque podría
haber información que no queremos que cualquier persona la pueda ver y mucho menos
entender, sino que quisiéramos que dicha información estuviera almacenada de forma
segura.

Una posible opción para esto es almacenando la información en formato binario, es decir,
que la información estará almacenada no en formato de texto plano sino en su
representación binaria (1s y 0s), lo cual permite tener mas privacidad (OJO, solo mas
privacidad, no mucha privacidad ni seguridad. Si el punto fuera como obtener una forma
segura de almacenar información tendríamos que mirar los temas de cifrado y hashing). En
.NET, el objeto que nos facilita trabajar con Stream de datos binarios es el BinaryWriter y
el BinaryReader, los cuales supongo pueden deducir como se utilizan según lo visto
anteriormente.

El primero permite escribir datos en un archivo de texto en formato binario mediante el


método Write(), el cual.tiene varias sobrecargas entre los cuales acepta varios tipos de dato
como por ejemplo int, long, bool, double, decimal, char, string. El segundo permite
recuperar información almacenada en formato binario por medio del método indicado.
Como así que por medio del método indicado?. Lo que sucede con el BinaryReader es que
no tiene un método Read genérico, sino que tiene un Read para cada tipo de dato que puede
ser escrito, por ejemplo ReadInt32, ReadBoolean, ReadChar, etc. Esto nos obliga a conocer
la estructura del archivo con el que estamos trabajando para poder leer el tipo de dato
correcto en la posición correcta.

A continuación se muestra un pequeño ejemplo sobre como utilizar el BinaryReader y el


BinaryWriter.
En el ejemplo anterior se observa como se puede escribir varios tipos de dato con el mismo
método Write del objeto BinaryWriter ya que tiene varias sobrecargas.

A continuación se muestra como se vería la información en el caso de intentar visualizarla


con un editor de texto:

Para leer información binaria se utiliza el objeto BinaryReader y se utiliza ³El método
indicado´.

En el ejemplo anterior se observa como se utiliza el método de lectura según el tipo de dato
que desee leer, lo cual implica que con anterioridad se conozca la estructura del archivo. En
este caso, nótese que se leyó exactamente en el mismo orden en el que se escribió la
información con el BinaryWriter.

El siguiente es el resultado de la ejecución del código anterior:


C  
 
  
Buenas
Veamos un poco como manejar los ficheros en la plataforma .NET específicamente
orientados a c#, en esta entrega solo nos enfocaremos a la clase File, luego utilizaremos
otras clases útiles.

Hagamos las inclusiones necesarias:

vercodigo
imprimir?
ß 

veamos algo básico, comprobar si un fichero o archivo de texto existe(usando Exist que
devuelve true si el fichero existe), si el existe borrarlo (usando Delete) y si no existe crearlo
(usando Create), la clase file no es necesaria crear un objeto, simplemente usamos sus
métodos directamente

Un detalle importante los path o direcciones se les pone arroba (@) antes para no usar las
direcciones clasicas tipo C:\\ blabla

vercodigo
imprimir?
ß 
 


  
 
  !"#$%
& 
' ($)$*+,-./.0.0(.( 1
2+
3
ß 4!5
62!(%%
ßß 
ß 
,!(%
ß 7
ß
ß 
ß 
!(%
ß& 7
ß' 7

fácil no? bastante diría yo.


Ahora imaginemos que queremos copiar un fichero o mas bien duplicarlo, pero también
queremos borrar el fichero original..mas fácil aun que lo anterior, usando Copy y Delete

vercodigo
imprimir?
ß 
 


  
 
  !"#$%
& 
' ($)$*+,-./.0.0(.+
3
ß 
,(!($8$+( 1
2+9$($8$+(::( 1
2+%
ßß 
!($8$+( 1
2+%
ß 7
ß 7

y ahora si queremos mover un fichero de un lugar a otro, llamemos origen y destino, pues
se hace de una manera bastante sencilla

vercodigo
imprimir?
ß 
 


  
 
  !"#$%
& 
' ( $)$*+,-./.0.0(.( 1
2+9
3 ($)$*+,-./.0.( 1
2+
ß
ßß 
!( 9$(%
ß
ß 7
ß 7

juguemos un poco mas, veamos el método Replace que ahorra un montón de trabajo, ¿que
hace? bueno el vacía en el archivo indicado el contenido de otro fichero, el cual es
eliminado pero se crea una copia de seguridad.

vercodigo
imprimir?
ß 
 


  
 
  !"#$%
& 
' $)$*+,-./.0.0(.( 1
2+9
3 $)$*+,-./.0.0(.(
2+9
ß ( $)$*+,-./.0. 
2
1+
ßß
ß 
;(!9$9$( %
ß 7
ß 7

veamos dos funciones bien útiles al momento de llevar controles, o como medidas de
seguridad.

vercodigo
imprimir?
ß 
 


  
 
  !"#$%
& 
' ($)$*+,-./.0.0(.( 1
2+
3
,
<=!+$$-$7+9$
ß

>,? /!(%%
,
<=!+/ $ 4-$7+9$
ßß

>=@? !(%%
ß ,
;A!%
ß
ß 7
ß 7

eso es todo (por ahora) en la proxima entrega veremos la entrada y salida, en otras palabras
como leer y escribir ficheros de texto tanto con la clase File como con otras clases.

Você também pode gostar