Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre como C# permite manejar archivos ya sea para crearlos, agregar informacion o simplemente extraer informacion de los mismos.

Anuncios

En este caso, C# provee varias formas para poder trabajar con nuestros archivos pero siempre va a ser de la misma manera por medio de un stream, en este caso hablare sobre las dos formas que me resultaron mas practicas y utiles, una va a ser por bytes y otro va a ser por texto o string, dependiendo de la situacion uno va a resultar mas practico que el otro, asi que veamos el primer ejemplo:

Archivos.cs

using System;
using System.IO;
using System.Text;

public class Program
{
	public static int Main()
	{
		string path = "prueba.txt";
		using(FileStream fs = File.Create(path))
		{
			AgregarTexto(fs,"Este es un texto de prueba,\n");
			AgregarTexto(fs,"Este es otra linea de prueba\n");
			AgregarTexto(fs,"\tUn texto con otras modificadores\n");
			AgregarTexto(fs,"Aqui tenemos \"con comillas\"\n");
		}
		using(FileStream fs = File.OpenRead(path))
		{
			byte[] b = new byte[1024];
			UTF8Encoding tmp = new UTF8Encoding(true);
			while(fs.Read(b,0,b.Length) > 0)
			{
				Console.WriteLine(tmp.GetString(b));
			}
		}
		return 0;
	}
	
	private static void AgregarTexto(FileStream fs, string valor)
	{
		byte[] info = new UTF8Encoding(true).GetBytes(valor);
		fs.Write(info, 0, info.Length);
	}
}
Anuncios

En este codigo usaremos a Filestream para poder manejar nuestros archivos, es decir que va a ser de la forma binaria, veamos este primer bloque:

using System;
using System.IO;
using System.Text;
Anuncios

En este caso usaremos el System de siempre para la Console, luego usaremos a System.IO para poder manejar los archivos y por ultimo System.Text para poder manejar las cadenas en bytes, ya veremos cuando es necesario, veamos nuestro siguiente bloque:

string path = "prueba.txt";
using(FileStream fs = File.Create(path))
{
	AgregarTexto(fs,"Este es un texto de prueba,\n");
	AgregarTexto(fs,"Este es otra linea de prueba\n");
	AgregarTexto(fs,"\tUn texto con otras modificadores\n");
	AgregarTexto(fs,"Aqui tenemos \"con comillas\"\n");
}
Anuncios

La primera linea se encarga de almacenar el nombre del archivo en una variable de tipo string llamada path, nuestro siguiente paso sera crear por medio de using un objeto de tipo FileStream al cual llamaremos fs, luego usaremos a la clase File y el metodo Create al cual le pasaremos el nombre del archivo que creamos antes, path, despues tendremos un bloque donde le agregaremos contenido a nuestro archivos por medio de la funcion AgregarTexto, en este caso primero le pasaremos el objeto que usamos para el archivo y despues un mensaje de texto, veamos al metodo AgregarTexto:

	private static void AgregarTexto(FileStream fs, string valor)
	{
		byte[] info = new UTF8Encoding(true).GetBytes(valor);
		fs.Write(info, 0, info.Length);
	}
Anuncios
Anuncios

En este tendremos una funcion por fuera del Main, esta tambien debe ser static para que pueda ser accedida desde el Main, y observen que recibe dos valores, uno de tipo FileStream y otro string (los valores que le enviamos), en el cuerpo tendremos un array de tipo byte, para poder trabajar directamente en codigo maquina, pero el constructor sera UTF8Encoding y a su vez usaremos GetBytes para transformar el string que enviamos en bytes y sea correctamente codificado, una vez hecho utilizamos el objeto que recibimos y por medio de Write lo escribimos, pasamos primero el objeto que creamos, luego la posicion inicial y por ultimo el final del mismo, esto lo va a hacer cada vez que lo llamemos, con esto concluiriamos nuestra escritura del archivo, pasemos a ver como recuperamos esos datos:

		using(FileStream fs = File.OpenRead(path))
		{
			byte[] b = new byte[1024];
			UTF8Encoding tmp = new UTF8Encoding(true);
			while(fs.Read(b,0,b.Length) > 0)
			{
				Console.WriteLine(tmp.GetString(b));
			}
		}
Anuncios
Anuncios

En este caso vamos a usar un metodo parecido al anterior ya que por medio de using creamos el objeto FileStream la llamaremos fs y en lugar de usar File.Create usaremos el OpenRead para acceder a nuestro archivo almacenado en path, en el bloque primero crearemos un array de tipo byte llamado b y lo crearemos con un tamaño de 1024, nuestro siguiente objeto sera de tipo UTF8Encoding llamado tmp y en el constructor le pasaremos true.

Nuestro siguiente paso sera un bucle while que leera el archivo (por medio de fs.Read), primero le pasamos el array donde almacenarlo, luego la posicion inicial y por ultimo la longitud del array, todo esto lo haremos mientras lo anterior sea mayor a 0, en el cuerpo mostraremos en pantalla por medio de tmp y el metodo GetString, lo convierte a cadena, al contenido de b, si lo compilamos y ejecutamos veremos la siguiente salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>archivos
Este es un texto de prueba,
Este es otra linea de prueba
        Un texto con otras modificadores
Aqui tenemos "con comillas"













C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Si bien funciono puede que no haya funcionado como nosotros queriamos, porque si bien trajo la informacion contenida al tener un array tan grande nos dejo un monton de espacio en blanco, con esto cubrimos la escritura en formato binario pasemos a ver la escritura de un archivo en cadena a traves del siguiente ejemplo:

Archivo.cs

using System;
using System.IO;

public class Program
{
	static int Main()
	{
		string path = "prueba.txt";

		using (StreamWriter sw = File.CreateText(path))
		{
			sw.WriteLine("Primera linea");
			sw.WriteLine("Segunda linea");
			sw.WriteLine("\tTercera linea con tabulador");
			sw.WriteLine("\"Cuarta linea entre comillas\"");
		}

		using (StreamReader sr = File.OpenText(path))
		{
			string s;
			while((s = sr.ReadLine()) != null)
			{
				Console.WriteLine(s);
			}
		}
		return 0;
	}
}
Anuncios

En este codigo como no vamos a necesitar nada extra con solamente la clase para manejar los archivos y System nos alcanza, volvemos a tener una variable para almacenar el nombre el archivo, veamos el bloque de escritura del archivo:

		using (StreamWriter sw = File.CreateText(path))
		{
			sw.WriteLine("Primera linea");
			sw.WriteLine("Segunda linea");
			sw.WriteLine("\tTercera linea con tabulador");
			sw.WriteLine("\"Cuarta linea entre comillas\"");
		}
Anuncios

Al igual que el caso anterior volvemos a usar el using para crear un objeto de tipo StreamWriter llamado sw y despues por medio del CreateText de File comenzaremos a crear el archivo informado en path, despues en el bloque usaremos al objeto junto a WriteLine para enviar distintos textos a nuestro archivo, cerramos el bloque y por ende cerramos a nuestro archivo, veamos el bloque de lectura:

		using (StreamReader sr = File.OpenText(path))
		{
			string s;
			while((s = sr.ReadLine()) != null)
			{
				Console.WriteLine(s);
			}
		}
Anuncios
Anuncios

Volvemos a utilizar using para generar nuestro nuevo objeto de tipo StreamReader llamado sr, pero esta vez usaremos a OpenText para acceder al archivo que generamos antes, despues en el bloque crearemos una variable llamada s de tipo string, para luego usar un bucle while donde en el condicional asignaremos a s el resultado de usar un ReadLine del objeto sr, este metodo lee linea por linea, y lo ejecutara mientras ese resultado sea distinto de null, por ultimo en el bloque while escribiremos lo que almacenamos en s, si lo compilamos y probamos veremos la siguiente salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>archivo
Primera linea
Segunda linea
        Tercera linea con tabulador
"Cuarta linea entre comillas"

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Como pueden ver esta forma de trabajar fue un poco mas sencilla y concreta, a diferencia del anterior, pero seguramente estan pensando porque no utilizar este segundo metodo? Sencillo, porque este es ideal para almacenar texto pero si necesitas almacenar por ejemplo una foto deberemos usar el metodo anterior, ya que el segundo metodo solo almacena texto en cambio con el otro podemos almacenar bytes (codigo maquina) que son unos y ceros y nos da la posibilidad de poder representar cualquier tipo de informacion, por eso la forma de manejar archivos se ajustara a nuestras necesidades y estos son los dos modelos mas basicos para trabajar.

Anuncios
Nota: En el caso del primer ejemplo recuerden que transformamos el texto en bytes para escribirlo y lo inverso para recuperarlo.
Anuncios

En resumen, hoy hemos visto como manejar archivos, hemos explicado algunos conceptos basicos, hemos comentado de que forma pueden trabajar, hemos visto un ejemplo de tipo binario y otro de tipo texto, hemos visto sus diferencias, tambien hemos visto cual puede ajustarse mas a nuestras necesidades, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

1.00 $