El manejo de archivos en la plataforma .NET se logra mediante la clase Stream que
representa un flujo de informacin (Un archivo es considerado un flujo de datos). La clase Stream es una clase a!stracta por lo que no es posi!le utili"arla directamente #a que no se puede crear instancias. Lo que se de!e hacer es utili"ar una de sus clases derivadas que se especiali"an en el tratamiento de streams para diferentes destinos como por ejemplo $ileStream (para el manejo de archivos) %emor#stream (para el manejo de datos en memoria). La primera opcin para escri!ir #&o leer datos de un archivo de te'to es utili"ar la clase $ileStream. Esta clase se encuentra en el namespace S#stem.() # es una clase derivada de la clase Stream. El $ileStream act*a como un intermediario entre el sistema de archivos # nuestra aplicacin permitiendo reali"ar de una manera limpia # sencilla operaciones de escritura # lectura en archivos. +ara utili"ar el $ileStream lo primero que se de!e hacer es crear una instancia que apunte al archivo deseado. string fileName = @"C:\temp.txt"; FileStream fs = new FileStream(fileName, FileMode.penrCreate, File!""ess.#rite, FileS$are.None%;
,omo se ve en la figura anterior es un constructor que reci!e una cantidad considera!le de par-metros. Tenemos la posi!ilidad de utili"ar alguno de los m.todos ofrecidos por la clase utilitaria $ile que nos permite o!tener un $ileStream con par-metros espec/ficos de acuerdo al m.todo utili"ado para o!tenerlo. 0 continuacin se muestra un ejemplo1 FileStream fs = File.Create(@"C:\temp.txt"%; En el ejemplo anterior se utili" el m.todo ,reate el cual crea el archivo en la ruta especificada # en caso de que el archivo e'ista es so!rescrito. Estos m.todos ofrecidos por la clase $ile facilitan el desarrollo de aplicaciones con manejo de archivos # permite una mejor lectura de cdigo. La plataforma .NET ofrece otras maneras de administrar Streams. Una de esas maneras es utili"ar la clase StreamWriter para escri!ir en archivos # StreamReader para leer desde archivos. Es necesario tener en cuenta que estas clases est-n orientadas a o!tener caracteres. ,on la clase Stream2riter solo nos de!emos preocupar por utili"ar el m.todo 2rite o 2riteLine para escri!ir datos en un archivo de te'to. Estos m.todos reci!en tipos de datos nativos del lenguaje como por ejemplo int !ool decimal float string char etc. 3 utili"a el codificador indicado cuando se instancia la clase para codificar los caracteres de salida al archivo de te'to. &sing S'stem.(; stati" )oid Main(string*+ args% , Stream#riter writer = new Stream#riter(@"C:\temp.txt"%; writer.#rite-ine(".sta es la primera l/nea del ar"$i)o."%; writer.Close(%; 0 La clase Stream2riter es una clase especiali"adas para el tra!ajo de Stream hacia archivos de te'to. La diferencia entre el m.todo 2rite # 2riteLine es que el segundo inserta un salto de l/nea al final de los datos ingresados haciendo que la pr'ima ve" que se quiera insertar se har- en la siguiente l/nea. 0unque la clase Stream2riter no hereda de la clase Stream si utili"a en su implementacin un Stream en el cual escri!e o lee secuencias de caracteres. +or eso esta clase en su interior se encarga de crear # utili"ar el Stream necesario para apuntar al archivo de te'to representado por la ruta que se utili"o en el constructor del ejemplo. Sin em!argo esta clase tam!i.n tiene otro constructor donde se le puede pasar un Stream que tengamos creado en lugar de la ruta como se ve a continuacin1 &sing S'stem.(; stati" )oid Main(string*+ args% , string fileName = "temp.txt"; FileStream stream = new FileStream(fileName, FileMode.penrCreate, File!""ess.#rite%; Stream#riter writer = new Stream#riter(stream%; writer.#rite-ine(".sta es la primera l/nea del ar"$i)o."%; writer.Close(%; 0 El complemento del o!jeto Stream2riter es el o!jeto Stream4eader cu#o principal o!jetivo es facilitarnos las tareas de lectura de cadenas de caracteres. ,on este o!jeto nos podemos despreocupar de esas tareas de !ajo nivel para poder o!tener un cdigo mucho m-s limpio # f-cilmente legi!le. &sing S'stem.(; stati" )oid Main(string*+ args% , Stream1eader reader = new Stream1eader(@"C:\temp.txt"%; #rite-ine(reader.1eadline(%%; writer.Close(%; 0 En el ejemplo se ve como f-cilmente se puede leer informacin de un archivo de te'to utili"ando el m.todo 4eadLine del o!jeto Stream4eader. Este m.todo simplemente lee la l/nea siguiente teniendo en cuenta la posicin actual del puntero del archivo. Es importante aclarar que utili"ando los streams vistos hasta el momento se pueden leer # escri!ir en archivos de te'to cadenas de caracteres es decir te'to plano. Esto implica que la informacin escrita en los archivos podr- ser vista # entendida por cualquier persona #a que se guarda tal # como se encuentra en un principio. Lo anterior puede llegar a ser un pro!lema en los casos en que se elige utili"ar archivos de te'to como repositorio de datos de una aplicacin (aunque esto es poco recomenda!le ha!r-n casos en los pueda llegar a ser necesario) # digo que es un pro!lema porque podr/a ha!er informacin que no queremos que cualquier persona la pueda ver # mucho menos entender sino que quisi.ramos que dicha informacin estuviera almacenada de forma segura. &sing S'stem.(; stati" )oid Main(string*+ args% , string fileName = "temp.txt"; FileStream stream = new FileStream(fileName, FileMode.pen, File!""ess.1ead%; Stream1eader reader = new Stream1eader(stream%; w$ile (reader.2ee3(% 4 56% , Console.#rite-ine(reader.1ead-ine(%%; 0 reader.Close(%; 0 .l StreamReader.Peek regresa &n entero 7&e representa el sig&iente "ar8"ter 7&e se )a a leer, o 56 si no $a' "ara"teres 7&e leer o si la se"&en"ia no admite la opera"i9n de :;s7&eda. Lectura y escritura de archivos Binarios en c# Una posi!le opcin para esto es almacenando la informacin en formato !inario es decir que la informacin estar- almacenada no en formato de te'to plano sino en su representacin !inaria (5s # 6s) lo cual permite tener mas privacidad ()7) solo mas privacidad no mucha privacidad ni seguridad. Si el punto fuera como o!tener una forma segura de almacenar informacin tendr/amos que mirar los temas de cifrado # hashing). En .NET el o!jeto que nos facilita tra!ajar con Stream de datos !inarios es el BinaryWriter # el BinaryReader los cuales supongo pueden deducir como se utili"an seg*n lo visto anteriormente. El primero permite escri!ir datos en un archivo de te'to en formato !inario mediante el m.todo 2rite() el cual.tiene varias so!recargas entre los cuales acepta varios tipos de dato como por ejemplo int long !ool dou!le decimal char string. El segundo permite recuperar informacin almacenada en formato !inario por medio del m.todo indicado. ,omo as/ que por medio del m.todo indicado8. Lo que sucede con el 9inar#4eader es que no tiene un m.todo 4ead gen.rico sino que tiene un 4ead para cada tipo de dato que puede ser escrito por ejemplo 4ead(nt:; 4ead9oolean 4ead,har etc. Esto nos o!liga a conocer la estructura del archivo con el que estamos tra!ajando para poder leer el tipo de dato correcto en la posicin correcta. 0 continuacin se muestra un peque<o ejemplo so!re como utili"ar el 9inar#4eader # el 9inar#2riter. $ileStream fs = ne> $ileStream(?!inario.t't@ $ile%ode.,reate)A 9inar#2riter !> = ne> 9inar#2riter(fs Encoding.UT$B)A Long codigo,liente = CDBEBDFA (nt edad = ;;A !ool puntual = falseA !>.2rite(codigo,liente)A !>.2rite(edad)A !>.2rite(puntual)A En el ejemplo anterior se o!serva como se puede escri!ir varios tipos de dato con el mismo m.todo 2rite del o!jeto 9inar#2riter #a que tiene varias so!recargas. Gepende de la operacin que se va#a a reali"ar con el archivo ser- el modo en que se a!ra ,reate )pen)r,reate 0ppend (0gregar informacin) )pen etc. 0 continuacin se muestra como se ver/a la informacin en el caso de intentar visuali"arla con un editor de te'to1 +ara leer informacin !inaria se utili"a el o!jeto 9inar#4eader # se utili"a ?El m.todo indicado@. $ileStream fs = ne> $ileStream(?!inario.t't@ $ile%ode.)pen)A 9inar#4eader !r = ne> 9inar#4eader(fs)A ,onsole.2rite(?,odigo ,liente1 ? H !r.4ead(ntFD())A ,onsole.2rite(?Edad1 ? H !r.4ead(nt:;())A ,onsole.2rite(?+untual1 ? H !r.4ead9oolean())A En el ejemplo anterior se o!serva como se utili"a el m.todo de lectura seg*n el tipo de dato que desee leer lo cual implica que con anterioridad se cono"ca la estructura del archivo. En este caso ntese que se le# e'actamente en el mismo orden en el que se escri!i la informacin con el 9inar#2riter.