domingo, 7 de junio de 2009

Archivos y flujos

Introducción
Las variables y los arreglos ofrecen solo un almacenamiento temporal de los datos; los datos se pierden cuando una variable local queda fuera de alcance o un programa termina. Los archivos y las bases de datos se utilizan para una retención a largo plazo de cantidades grandes de datos.
Jerarquía de datos
Todos los elementos de datos que procesan los computadores se reducen a combinaciones de 0 y de 1. El elemento más pequeño de datos que soporta las computadoras es el digito binario (bit).
Los elementos de datos procesados por las computadoras Los elementos de datos procesados por las computadoras Los elementos de datos procesados por las computadoras forman una jerarquía de datos en la cual los elementos se hacen mas grande y complejos en estructura a medida que progresamos de bits caracteres, de caracteres a campos y de campos hasta llegar a conjuntos de datos mas grandes.
C# considera cada archivo como flujo secuencial de bytes, cuando se abre un archivo se crea un objeto que se asocia con un flujo, existen muchas clases de procesamiento de archivos en FCL, el espacio de nombres System.IO, incluye flujos como StreamReader, StreamWriter y FIleStream.
Estas clases de flujos heredan de las clases Abstract, TextReader, TextWriter y Stream .
Las clases File y Directory
Las clases File puede determinar información acerca de los archivos y puede usarse para abrir archivos en modo de lectura o de escritura, la clase Directory cuenta con herramientas para manipular directorios, el objeto DirectoryInfo devuelto por el método create, Directory contiene información acerca de un directorio, gran parte de la información contenida de la clase DirectoryInfo, también puede utilizarse a través de los métodos de la clase Directory.
Creación de un archivo de texto de acceso secuencial
El programa C# no impone una estructura en los archivos, esto significa que debe estructurar los archivos para cumplir con los requerimientos de sus aplicaciones.
Lectura de datos desde un archivo de texto de acceso secuencial
La clase LeerArchivoAccesoSecuencial lee registros del archivo creado por el programa y después muestra el contenido de cada registro.
Búsqueda de un archivo de acceso secuencial
Para recuperar los datos en forma secuencial de un archivo, lo común es que un programa empiece desde el principio del archivo, leyendo en forma consecutiva hasta los datos deseados. Algunas veces es necesario procesar un archivo en forma secuencial varias veces a cualquier posición en el archivo, cuando se abre un objeto FileStream, su apuntador de posición se establece de posición se establece a la posición byte 0.
Serielización
Un objeto serializado se presenta como una secuencia de bytes que incluye los datos de ese ejemplo así como información acerca del tipo del objeto. Una vez que se escribe un objeto serializado en un archivo, puede leerse desde ese archivo y deserializarse; esto es la información sobre el tipo y los bytes que representan al objeto y sus datos pueden usarse para recrear el objeto en la memoria. La clase BinaryFormatter permite escribir o leer objetos completos en/desde un flujo. El método Serialize de BinaryFormatter leer esta representación de un archivo y reconstruye el objeto original. Ambos métodos lanzan una excepción SerializationExeption si ocurre un error durante la serielización o la deserializacion ambos métodos requieren un objeto stream como parámetro para que el objeto BinaryFormatter pueda acceder al flujo correcto.
Creación de un archivo de acceso secuencial mediante el uso de la serielización de objetos
Clase RegistroSerializable:
En una clase marcada con el atributo Serializable o que implementa la interfaz ISerializable, debemos asegurarnos que toda variable de instancia de la clase también sea serializable. Todas las variables simples y los objetos string son serializables. Para las variables de tipos por referencia, hay que comprobar la declaración de la clase para asegurarnos que el tipo sea serializable, los objetos tipo arreglo son serializables de manera predeterminada, no obstante, si el arreglo contiene referencias a otros objetos, estos podrían no ser o ser serializables.


Ejemplo
using System;
using System.Windows.Forms;
using System.IO;
usiyng BibliotecaBanco;

public partial class LeerArchivosAccesoSecuencialForm : BancoUIForm
{
private FileStream entrada;
private StreamReader archivoReader;
public LeerArchivoAccesoSecuencialForm();
{
InitializeComponent();
}
private void abrirButton:Click(object sender, EventArgs e )
{
OpenFileDialog selectorArchivo ? new OpenFileDialog();
DialogResult resultado = selectorArchivo.ShowDialog();
string nombreArchivo;
if(resultado== DialogResult.Cancel)
return;
nombreArchivo=selectoeArchivo.FileName;
BorrarControlesTextBox();
if(nombreArchivo==""||nombreArchivo==null)
MessageBox.Show("Nombre de archivo invalido", "Error", MessageBoxButtons.Ok, MessajeBoxIcon.Error);
else
{
entrada = nue FileStream(nombreArchivo, FileMode, Open, FileAccess.Read);
archivoReader = new StreamReader(entrada);
abrirButton.Eneabled = false;
siguienteButton.Eneabled= true;
}
}
private void siguienteButton_Click(object sender, EventArgs e)
{
try
{
string registroEntrada = archivoReader.ReadLine();
string [] camposEntrada;
if(registroEntrada!=null)
{camposEntrada=registroEntrada.Split(',');
Registro registro = new Registro(Convert.toInt31(camposEntrada[0], camposEntrada[1], camposEntrada[2],Convert.ToDecimal( camposEntrada[3]));
EstrablecerValoresControlesTextBox(camposEntrada);
}
else
{
archivoReader.Close();entrada.Close();
abrirButton.Eneabled = true;
siguienteButton.Eneabled= false;
BorrarControlesTextBox();

MessageBox.Show("No hay mas registros en el archivo", "", MessageBoxButtons.OK, MessajeBoxIcon.Information);
}
}
catch(IOException)
{
MessageBox.Show( "Error al leer del archivo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}