Академический Документы
Профессиональный Документы
Культура Документы
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.
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.
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.
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.
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.
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.
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
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.