示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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;
        }