Professional Documents
Culture Documents
El almacenamiento en variables, arreglos o colecciones es temporal; los datos se pierden cuando una variable local queda fuera del alcance, o cuando la aplicacin termina. Las computadoras utilizan archivos de datos para la retencin a largo plazo de grandes cantidades de datos, incluso hasta despus de que terminan las aplicaciones que crean esos datos. Se denominan datos persistentes a aquellos que duran ms all de la duracin de la ejecucin de la aplicacin. Las computadoras almacenan archivos en dispositivos de almacenamiento secundario como disco duros, USB, discos pticos y cintas magnticas.
ARCHIVOS DE DATOS
El procesamiento de archivos es una de las herramientas ms importantes que debe tener un lenguaje de programacin para soportar las aplicaciones comerciales que generalmente procesan grandes cantidades de datos persistentes. C# posee pose poderosas caractersticas de procesamiento de archivos de datos, las cuales permiten a una aplicacin leer y escribir datos en memoria interna y/o memoria externa o en archivos a travs de la red. Entre las operaciones que se pueden realizar con archivos de datos tenemos: Agregar registros de datos (Alta) Eliminar registros de datos (Baja) Acceder a registros, siguiendo algn mtodo (secuencial, directo, secuencial indexado, etc) Consultar la informacin almacenada en los registros de datos (Consulta) Modificar la informacin de los registros de datos (Modificacin)
ORGANIZACIN DATOS
Campo
DE
LOS
ARCHIVOS
DE
Los archivos de datos se organizan de la siguiente forma: Es el agrupamiento de caracteres o nmeros para formar una palabra o una cifra completa, como el cdigo o nombre de un alumno. Registro Es un grupo de campos relacionados considerados como una unidad. Archivo/tabla Es un grupo de registros relacionados del mismo tipo. Base de datos Es un grupo de archivos/tabla relacionados que almacenan la informacin de una organizacin. ORGANIZACIN SECUENCIAL Mtodo para almacenar registros de datos, en el cual los registros se deben recuperar en el mismo orden en que se almacenaron. ORGANIZACIN DIRECTA O ALEATORIA.
Mtodo para almacenar registros de datos en un archivo de modo que se pueda acceder a ellos en cualquier secuencia sin importar su orden fsico real en los medios de almacenamiento. ORGANIZACIN SECUENCIAL INDEXADA El mtodo utiliza un ndice de campo clave para buscar y localizar fsicamente un registro, como pueden localizarse los temas clave en un libro. Utiliza un arreglo de ndice en la RAM donde se almacena en forma ordenada el campo clave y la direccin fsica de los registros. Despus de operaciones de mantenimiento este arreglo de ndices puede ser grabado en forma separada en el medio magntico para luego ser utilizado en la prxima sesin previa carga de los ndices en la memoria RAM. Un ndice es una tabla o lista que contiene las claves de registros con las posiciones fsicas en archivo de acceso indexado. JERARQUA DE DATOS Archivo de Notas Base de datos Archivo de expedientes personales Archivo de CxP
Archivo/tabla
apellidoNombre
evaluacin
evaluacin parcial 2
promedio de trabajo 11 12 13 11 12
11 12 13 evaluacin
Registro
alumno_id promedio 1 11
promedio final
parcial 2 de trabajo 11 11
Campo
Byte
10000001
Letra A en ASCII
Bit
fin; sino acceder al archivo como una base de datos, donde se salta de un registro a otro; cada uno en diferentes partes del archivo. C# proporciona una clase RandomAccessFile para este tipo de entrada/salida. FLUJOS La comunicacin entre una aplicacin y el origen o el destino de cierta informacin se realiza mediante un flujo de informacin (stream), que no es ms que un objeto que hace de intermediario entre la aplicacin y el origen o el destino de datos de la informacin. De esta forma la aplicacin leer o escribir en el flujo sin importarle desde donde viene la informacin o donde se va. El espacio de nombres System.IO de la biblioteca .Net contiene una coleccin de clases que soportan estos algoritmos para leer y escribir datos. La clase FileStream subclase de Stream permite escribir y leer datos de un archivo byte a byte; analgicamente, las clases StreamWriter y StreamReader subclases de TextWriter y textReader permiten escribir y leer caracteres. Las clases BinaryWriter y BinaryReader permiten escribir y leer datos de cualquier tipo primitivos en binario y cadena de caracteres. FLUJO DE BYTES Los datos pueden ser escritos o ledos de un archivo byte a byte utilizando un flujo de la clase FileStream FileStream Un flujo de la clase FileStream permite leer y escribir bytes en un archivo. Esta clase adems de los mtodos que hereda de la clase Stream, proporciona el constructor siguiente: FileStream(string nombre, FileMode, FileAccess acceso) El constructor abre el flujo de entrada y salida (para leer y escribir) vinculando con el archivo especificado por el nombre y especificando el tipo de acceso (leer, Escribir o leer y escribir). El parmetro nombre es una cadena de caracteres que especifica la ruta donde se guarda o se guardar el archivo. El parmetro modo, del tipo enumerado FileMode, puede tomar los siguientes valores:
CreateNew Create Open OpenOrCreate Truncate Append Read ReadWrite Write Crear un nuevo archivo. Si el archivo existe se lanzar una excepcin del tipo IOException Crea un nuevo archivo. Si el archivo existe ser sobreescrito Abre un archivo existente Abre un archivo si existe; si no, se crea un nuevo archivo Abre un archivo existente. Una vez abierto, el archivo ser truncado a cero bytes de longitud Abre un archivo para aadir datos al final del mismo si existe o crea uno nuevo sino existe Permite abrir un archivo para operaciones de lectura Permite abrir un archivo para operaciones de lectura / escritura Permite abrir un archivo para operaciones de escritura
FLUJOS DE DATOS PRIMITIVOS Muchas aplicaciones requieren escribir en un archivo datos de tipos primitivos (bool, double, float, long, int, short, etc) no como cadena de caracteres, sino en formato binario para posteriormente recuperarlos como tal. Para estos casos el espacio de nombres System.IO proporciona las clases BinaryReader y BinaryWriter, las cuales permiten leer y escribir respectivamente datos de cualquier tipo primitivo en formato
binario y cadena de caracteres en formato UTF-8. Un flujo BinaryReader slo puede leer datos almacenados en un archivo a travs de un flujo BinaryWriter. BinaryWriter Un flujo de la clase BinaryWriter permite a una aplicacin escribir datos de cualquier tipo primitivos. Se puede crear un flujo de esta clase utilizando el siguiente constructor: BinaryWriter(Stream flujo) Este constructor abre un flujo de salida (para escribir) hacia el archivo vinculado con otro flujo existente de la clase Stream o de sus derivadas. Ejemplo:
public Boolean escribirRegistro ( Alumno oAlumno, int posicion ) { String archivo=Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistro; FileStream fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter bw = new BinaryWriter(fs); bw.BaseStream.Seek(posicion*longitudDeRegistro,SeekOrigin.Begin); bw.Write(oAlumno.getAlumno_id()); bw.Write(oAlumno.getApellidoNombre()); bw.Write(oAlumno.getEvaluacionParcial1()); bw.Write(oAlumno.getEvaluacionParcial2()); bw.Write(oAlumno.getPromedioDeTrabajo()); bw.Write(oAlumno.getPromedioFinal()); bw.Close(); fs.Close(); return true; } Los mtodos ms utilizados de esta clase se resumen en la tabla siguiente:
Write Write Write Write Write Write Write Write Write Write
(byte) (byte[]) (char) (char[]) (short) (int) (long) (Decimal) (float) (double)
Escribe un valor de tipo byte Escribe una cadena como una secuencia de bytes Escribe un valor de tipo char Escribe una cadena como una secuencia de caracteres Escribe un valor de tipo short Escribe un valor de tipo int Escribe un valor de tipo long Escribe un valor de tipo Decimal Escribe un valor de tipo float Escribe un valor de tipo double Escribe una cadena de caracteres en formato UTF-8; el primer byte o los dos primeros bytes especifican el nmero de bytes de datos escritos a continuacin Obtiene el flujo subyacente (fs en la figura anterior) Cierra el flujo y libera los recursos adquiridos Limpia el buffer asociado con el flujo Establece movimiento del puntero de Lectura/Escritura en el flujo
BinaryReader Un flujo de la clase BinaryReader, permite a una aplicacin leer datos de cualquier tipo primitivos escritos por un flujo de la clase BinaryWriter. Se puede crear un flujo de esta clase utilizando el siguiente constructor: BinaryReader(Stream flujo) Este constructor abre un flujo de entrada (para leer) desde el archivo vinculando con otro flujo existente de la clase Stream o de sus derivadas. Ejemplo:
Programa <-- br <-- fs <-- Archivo public Alumno leerRegistro(Alumno oAlumno, int posicion) { String archivo = Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistro; FileStream fs = new FileStream(archivo, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); br.BaseStream.Seek(posicion*longitudDeRegistro, SeekOrigin.Begin); oAlumno = new Alumno(br.ReadInt32(),br.ReadString(),br.ReadDouble(),br.ReadDouble(),br.ReadDouble(), br.ReadDouble() ); br.Close(); fs.Close(); return oAlumno; } Los mtodos ms utilizados de esta clase se resumen en la tabla siguiente:
ReadByte ReadBytes ReadChar ReadChars ReadInt16 ReadInt32 ReadInt64 ReadDecimal ReadSingle ReadDouble ReadString BaseStream Close PeekChar
Devuelve un valor de tipo byte Devuelve un valor de tipo byte[ ] Devuelve un valor de tipo char Devuelve un valor de tipo char[ ] Devuelve en valor de tipo short Devuelve un valor de tipo int Devuelve un valor de tipo long Devuelve un valor de tipo decimal Devuelve una valor de tipo float Devuelve un valor de tipo double Devuelve una cadena de caracteres en formato UTF-8; el primer o dos primeros bytes especifican el nmero de bytes de datos que sern ledos a continuacin Obtiene el flujo subyacente Cierra el flujo y libera los recursos adquiridos Obtiene el siguiente carcter sin extraerlo
PROPIEDADES Y MTODO PARA ACCESO ALEATORIO La clase FileStream, que se deriva directamente de Stream, implementa las propiedades Position y Length y el mtodo seek que combinados entre s facilitan el acceso aleatorio a un archivo. Position : Devuelve la posicin actual en bytes del puntero de lectura/escritura en un archivo Length : Devuelve la longitud del archivo en bytes Seek : Mueve el puntero de lectura/escritura a una nueva localizacin desplazada desp bytes de la posicin pos del archivo La posicin pos es un valor de tipo SeekOrigin que define las siguientes constantes: Begin : Hace referencia a la primera posicin en el archivo Current : Hace referencia a la posicin actual del puntero de lectura/escritura End : Hace referencia a la ltima posicin en el archivo. Ejemplo:
public int buscarRegistro(int busqueda) { Alumno oAlumno;// Delaracin del objeto oAlumno String archivo = Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistro; FileStream fs = new FileStream(archivo, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs);
A continuacin se presenta un ejemplo de una aplicacin que administra un archivo de acceso aleatorio:
DIAGRAMA DE CLASES
CDIGO - Program
using using using using System; System .Collections .Generic; System .Linq; System .Windows .Forms;
namespace ArchivoDeDatosConGUIyDAO { static class Program { /// <summary> /// Punto de entrada principal para la aplicacin. /// </summary> [STAThread] static void Main ( ) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormularioABCM()); } }
public Boolean eliminarRegistro(int busqueda) { Alumno oAlumno = new Alumno(); int posicion = buscarRegistro(busqueda); if(posicion != -99) { oAlumno = leerRegistro(oAlumno, posicion); oAlumno.setAlumno_id(0); if(escribirRegistro(oAlumno, posicion)) { return true; } else { return false; } } else { return false; } } public Boolean modificarRegistro ( int busqueda, Alumno oAlumno ) { Alumno oAlumno; String archivo = Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistro; FileStream fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.Read); BinaryReader br = new BinaryReader(fs); int encontrado = 0; int posicion = 0; int tamaoDelArchivo = numeroDeRegistro(); while ( (posicion < tamaoDelArchivo) && (encontrado == 0) ) { br.BaseStream.Seek(posicion*longitudDeRegistro,SeekOrigin.Begin); oAlumno=new Alumno(br.ReadInt32(),br.ReadString(),br.ReadDouble(),br.ReadDouble(),br.ReadDouble(),br.ReadDouble() ); if ( busqueda == oAlumno.getAlumno_id() ) { encontrado = 1; } else { posicion++; } } fs.Close(); br.Close(); if ( encontrado == 1 ) { return posicion; } else { return -99; } } public Alumno leerRegistro(Alumno oAlumno, int posicion) { String archivo = Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistro; FileStream fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.Read); BinaryReader br = new BinaryReader(fs); br.BaseStream.Seek(posicion*longitudDeRegistro, SeekOrigin.Begin); oAlumno=new Alumno(br.ReadInt32(), br.ReadString(), br.ReadDouble(), br.ReadDouble(), br.ReadDouble(), br.ReadDouble()); fs.Close(); br.Close(); return oAlumno; } public Boolean escribirRegistro ( Alumno oAlumno, int posicion ) { String archivo=Properties.Settings.Default.nombreDeArchivo;
public List<Alumno> obtenerDatosEnList() { AlumnoDAO oAlumnoDAO = new AlumnoDAO(); String archivo = Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties.Settings.Default.longitudDeRegistro; List<Alumno> oListAlumno = new List<Alumno>(); FileStream fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.Read); BinaryReader br = new BinaryReader(fs); Alumno oAlumno; for (int posicion = 0; posicion < oAlumnoDAO.numeroDeRegistro(); posicion = posicion + 1) { br.BaseStream .Seek(posicion * longitudDeRegistro, SeekOrigin.Begin); oAlumno=new Alumno(br.ReadInt32(),br.ReadString(), br.ReadDouble(),br.ReadDouble(),br.ReadDouble(), br.ReadDouble()); oListAlumno.Add(oAlumno); } br.Close(); fs.Close(); return oListAlumno; }
public int numeroDeRegistro() { String archivo = Properties.Settings.Default.nombreDeArchivo; int longitudDeRegistro = Properties .Settings.Default.longitudDeRegistro; FileStream fs = new FileStream(archivo,FileMode.OpenOrCreate, FileAccess.Read); int n = (int) (Math.Ceiling((double) fs.Length / (double) longitudDeRegistro)); fs .Close(); return n; } } }
dataGridViewAlumno.BorderStyle = BorderStyle.Fixed3D;
// Para cambiar mediante programacin el color de la lnea de la cuadrcula
dataGridViewAlumno.GridColor = Color.Blue;
// Para indicar la forma de seleccin de las filas
dataGridViewAlumno.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
// Para especificar los colores de primer plano y de fondo de celdas // seleccionadas de DataGridView
dataGridViewAlumno.RowsDefaultCellStyle.BackColor = Color.Pink; dataGridViewAlumno.AlternatingRowsDefaultCellStyle.BackColor = Color.Purple; // Para especificar la alineacin del texto de celdas de DataGridView dataGridViewAlumno.Columns["ColumnAlumno_id"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; dataGridViewAlumno.Columns["ColumnApellidoNombre"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; dataGridViewAlumno.Columns["ColumnEvaluacionparcial1"].DefaultCellStyle.Alignme nt = DataGridViewContentAlignment.MiddleRight; dataGridViewAlumno.Columns["ColumnEvaluacionparcial2"].DefaultCellStyle.Alignme nt = DataGridViewContentAlignment.MiddleRight; dataGridViewAlumno.Columns["ColumnPromedioDetrabajo"].DefaultCellStyle.Alignme nt = DataGridViewContentAlignment.MiddleRight; dataGridViewAlumno.Columns["ColumnPromedioFinal"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dataGridViewAlumno.DefaultCellStyle.ForeColor = Color.Black; dataGridViewAlumno.DefaultCellStyle.BackColor = Color.Beige; } private Alumno getObjetoAlumno() { Alumno oAlumno = new Alumno(); oAlumno.setAlumno_id(int.Parse(textBoxAlumno_id.Text)); oAlumno.setApellidoNombre(textBoxApellidoNombre.Text);
oAlumno.setEvaluacionParcial1(double.Parse(textBoxEvaluacionParcial1.Text)); oAlumno.setEvaluacionParcial2(double.Parse(textBoxEvaluacionParcial2.Text)); oAlumno.setPromedioDeTrabajo(double.Parse(textBoxPromedioDeTrabajo.Text)); return oAlumno; } private void setObjetoAlumno(Alumno oAlumno) { textBoxAlumno_id.Text = oAlumno.getAlumno_id() + ""; textBoxApellidoNombre.Text = oAlumno.getApellidoNombre() + ""; textBoxEvaluacionParcial1.Text = oAlumno.getEvaluacionParcial1() + ""; textBoxEvaluacionParcial2.Text = oAlumno.getEvaluacionParcial2() + ""; textBoxPromedioDeTrabajo.Text = oAlumno.getPromedioDeTrabajo() + ""; }
private void limpiarDataGridViewAlumno() { dataGridViewAlumno.Rows.Clear(); } private void actualizarDataGridViewAlumno() { limpiarDataGridViewAlumno(); AlumnoDAO oAlumnDAO = new AlumnoDAO(); List<Alumno> oListAlumno = oAlumnDAO.obtenerDatosEnList(); for (int posicion = 0; posicion < oListAlumno.Count; posicion=posicion+1) { if(oListAlumno[posicion].getAlumno_id()!=0) { dataGridViewAlumno.Rows.Add(oListAlumno[posicion].getAlumno_id(), oListAlumno[posicion], oListAlumno[posicion].getEvaluacionParcial1(), oListAlumno[posicion].getEvaluacionParcial2(), oListAlumno[posicion].getPromedioDeTrabajo(), oListAlumno[posicion].getPromedioFinal()); } } } private void dataGridViewAlumno_MouseClick(object sender, MouseEventArgs e) { if ((e.Clicks == 1) && (dataGridViewAlumno.RowCount>=1)) { int filaSeleccionada = dataGridViewAlumno.CurrentRow.Index; if (filaSeleccionada != -1) { Alumno oAlumnoSeleccionado = (Alumno) dataGridViewAlumno.Rows[filaSeleccionada].Cells[1].Value; setObjetoAlumno(oAlumnoSeleccionado); } } } private void habilitarBotonesABCM(
Boolean cBuscar, Boolean cNuevo, Boolean cGuardar, Boolean cEditar, Boolean cEliminar, Boolean cCancelar, Boolean cSalir)
{ buttonBuscar.Enabled = cBuscar; buttonNuevo.Enabled = cNuevo; buttonGuardar.Enabled = cGuardar; buttonModificar.Enabled = cEditar; buttonEliminar.Enabled = cEliminar; buttonCancelar.Enabled = cCancelar; buttonSalir.Enabled = cSalir; } public void limpiarCajasDeTexto()
} else } else
{ MessageBox.Show("No }
se
pudo
eliminar
el
registro
...!!!" );
} } else { MessageBox.Show("Se tiene que seleccionar un registro ...!!!"); } } else { MessageBox.Show("No existen registros ...!!!"); } } private void FormularioABCMyDAOyBD_FormClosing(object sender, FormClosingEventArgs e)