public List <Tupla> leerLista(Tabla tabla, ComparadorTuplas comparador) { FileStream archivo = null; //archivos.TryGetValue(tabla.getArchivo(), out archivo); archivo = new FileStream(tabla.getArchivo(), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); IFormatter formatter = new BinaryFormatter(); List <Tupla> lista = new List <Tupla>(); while (archivo.Position < archivo.Length) { //Tupla aux = (Tupla)formatter.Deserialize(archivo); Tupla aux = leerYavanzar(archivo, tabla); if (aux != null && comparador(aux)) { lista.Add(aux); } } archivo.Close(); //archivo.Position = 0; return(lista); }
public Tupla buscar(Tabla tabla, ComparadorTuplas comparador) { FileStream archivo = null; //archivos.TryGetValue(tabla.getArchivo(), out archivo); archivo = new FileStream(tabla.getArchivo(), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); IFormatter formatter = new BinaryFormatter(); bool encontre = false; Tupla tupla = null; while (archivo.Position < archivo.Length && !encontre) { //Tupla aux = (Tupla)formatter.Deserialize(archivo); Tupla aux = leerYavanzar(archivo, tabla); if (aux != null && comparador(aux)) { tupla = aux; encontre = true; } } archivo.Close(); //archivo.Position = 0; return(tupla); }
public void escribir(Tabla tabla, Tupla dato) { FileStream archivo = null; //archivos.TryGetValue(tabla.getArchivo(), out archivo); archivo = new FileStream(tabla.getArchivo(), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); IFormatter formatter = new BinaryFormatter(); if (dato.getId() >= tabla.getSiguienteIdDisponible()) { //es id nuevo, inserta lock (semaforoInsertar) { archivo.Position = archivo.Length; long posicionAnterior = archivo.Position; tabla.guardarUltimoId(dato.getId()); formatter.Serialize(archivo, dato); //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico) //asi q agrego tantos byte como falten long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior); archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta); } } else { //modificacion Tupla t = null; //si o si va a estar, pues se usa borrado logico //pero puede no estar, si se está haciendo restauracion long posicion = 0; if (archivo.Position < archivo.Length) { posicion = archivo.Position; t = leerYavanzar(archivo, tabla); } while (archivo.Position < archivo.Length && t.getId() != dato.getId()) { posicion = archivo.Position; t = leerYavanzar(archivo, tabla); } if (t == null || t.getId() != dato.getId()) { //no estaba posicion = archivo.Length; lock (semaforoInsertar)//lock para insertar { long posicionAnterior = archivo.Position; formatter.Serialize(archivo, dato); //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico) //asi q agrego tantos byte como falten long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior); archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta); } } else { //estaba archivo.Position = posicion; long posicionAnterior = archivo.Position; formatter.Serialize(archivo, dato); //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico) //asi q agrego tantos byte como falten long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior); archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta); } } archivo.Flush(); archivo.Close(); //archivo.Position = 0; }