Exemple #1
0
 internal void LimpiarNodoEnDisco(FileStream archivo, int tamañoEncabezado, IFabricaTextoTamañoFijo <T> fabrica)
 {
     // Se limpia el contenido del nodo
     LimpiarNodo(fabrica);
     // Se guarda en disco el objeto que ha sido limpiado
     GuardarNodoEnDisco(archivo, tamañoEncabezado);
 }
Exemple #2
0
        public ListaEnlazada(string nombreArchivo, IFabricaTextoTamañoFijo <T> fabrica)
        {
            // Se guardan los parámetros recibidos
            _archivoNombre = nombreArchivo;
            _fabrica       = fabrica;

            // Se abre la conexión al archivo
            _archivo = new FileStream(_archivoNombre, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

            // Se obtienen los valores del encabezado del archivo
            _cabeza = Utilidades.LeerEntero(_archivo, 0);
            _ultimaPosicionLibre = Utilidades.LeerEntero(_archivo, 1);
            Tamanio = Utilidades.LeerEntero(_archivo, 2);

            // Se corrigen los valores del encabezado cuando el archivo no existe previamente
            if (_ultimaPosicionLibre == Utilidades.ApuntadorVacio)
            {
                _ultimaPosicionLibre = 0;
            }

            if (Tamanio == Utilidades.ApuntadorVacio)
            {
                Tamanio = 0;
            }

            // Si el archivo existe solamente se actualizan los encabezados, sino se crea y luego
            // se almacenan los valores iniciales
            GuardarEncabezado();
        }
Exemple #3
0
        internal void LimpiarNodoEnDisco(FileStream archivo, int tamañoEncabezado, IFabricaTextoTamañoFijo <T> fabrica)
        {
            LimpiarNodo(fabrica);


            GuardarNodoEnDisco(archivo, tamañoEncabezado);
        }
Exemple #4
0
        internal void LimpiarNodoEnDisco(FileStream archivo, int tamañoEncabezado, IFabricaTextoTamañoFijo <T> fabrica)
        {
            //Se limpia el contenido del nodo
            Siguiente = Utilidades.ApuntadorVacio;
            Anterior  = Utilidades.ApuntadorVacio;
            Dato      = fabrica.FabricarNulo();

            GuardarNodoEnDisco(archivo, tamañoEncabezado);
        }
Exemple #5
0
        public ArbolB(int orden, string nombreArchivo, IFabricaTextoTamañoFijo <T> fabrica)
        {
            // Se guardan los parámetros recibidos
            _archivoNombre = nombreArchivo;
            _fabrica       = fabrica;

            // Se abre la conexión al archivo

            _archivo = new FileStream(_archivoNombre, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

            // Se obtienen los valores del encabezado del archivo
            _raiz = Utilidades.LeerEntero(_archivo, 0);
            _ultimaPosicionLibre = Utilidades.LeerEntero(_archivo, 1);
            Tamaño = Utilidades.LeerEntero(_archivo, 2);
            Orden  = Utilidades.LeerEntero(_archivo, 3);
            Altura = Utilidades.LeerEntero(_archivo, 4);

            // Se corrigen los valores del encabezado cuando el archivos no existe previamente
            if (_ultimaPosicionLibre == Utilidades.ApuntadorVacio)
            {
                _ultimaPosicionLibre = 0;
            }

            if (Tamaño == Utilidades.ApuntadorVacio)
            {
                Tamaño = 0;
            }

            if (Orden == Utilidades.ApuntadorVacio)
            {
                Orden = orden;
            }

            if (Altura == Utilidades.ApuntadorVacio)
            {
                Altura = 1;
            }

            if (_raiz == Utilidades.ApuntadorVacio)
            {
                // Se crea la cabeza del árbol vacía
                // para evitar futurs errores
                NodoB <T> nodoCabeza = new NodoB <T>(Orden, _ultimaPosicionLibre, Utilidades.ApuntadorVacio, _fabrica);
                _ultimaPosicionLibre++;
                _raiz = nodoCabeza.Posicion;
                nodoCabeza.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario);
            }

            // Si el archivo existe solamente se actualizan los encabezados, sino
            // se crea y luego se almacenan los valores iniciales
            GuardarEncabezado();
        }
Exemple #6
0
 internal NodoB(int orden, int posicion, int padre, IFabricaTextoTamañoFijo <T> fabrica)
 {
     if ((orden < OrdenMinimo) || (orden > OrdenMaximo))
     {
         throw new ArgumentOutOfRangeException("orden");
     }
     if (posicion < 0)
     {
         throw new ArgumentOutOfRangeException("posicion");
     }
     Orden = orden; Posicion = posicion; Padre = padre;
     LimpiarNodo(fabrica);
 }
Exemple #7
0
        //Constructor
        internal Nodes(int orden, int posicion, int padre, IFabricaTextoTamañoFijo <T> fabrica)
        {
            if ((orden < MinOrder) || (orden > MaxOrder))
            {
                throw new ArgumentOutOfRangeException("orden");
            }

            if (posicion < 0)
            {
                throw new ArgumentOutOfRangeException("posicion");
            }

            Orden  = orden; Position = posicion;
            Father = padre;

            LimpiarNodo(fabrica);
        }
Exemple #8
0
        //Limpia un nodo para poder inicializarlos
        private void LimpiarNodo(IFabricaTextoTamañoFijo <T> fabrica)
        {
            Hijos = new List <int>();
            for (int i = 0; i < Orden; i++)
            {
                Hijos.Add(Utilidades.ApuntadorVacio);
            }

            Llaves = new List <string>();
            for (int i = 0; i < Orden - 1; i++)
            {
                Llaves.Add("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
            }

            Datos = new List <T>();
            for (int i = 0; i < Orden - 1; i++)
            {
                Datos.Add(fabrica.FabricarNulo());
            }
        }
Exemple #9
0
        private void LimpiarNodo(IFabricaTextoTamañoFijo <T> fabrica)
        {
            Children = new List <int>();
            for (int i = 0; i < Orden; i++)
            {
                Children.Add(Utilities.ApuntadorVacio);
            }

            Keys = new List <int>();
            for (int i = 0; i < Orden - 1; i++)
            {
                Keys.Add(Utilities.ApuntadorVacio);
            }

            Datos = new List <T>();
            for (int i = 0; i < Orden - 1; i++)
            {
                Datos.Add(fabrica.FabricarNulo());
            }
        }
Exemple #10
0
        public ArbolB(int orden, string nombreArchivo, IFabricaTextoTamañoFijo <T> _Creador)
        {
            NombreArchivo = nombreArchivo;
            Creador       = _Creador;

            archivo        = new FileStream(nombreArchivo, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
            raiz           = Utilities.LeerEntero(archivo, 0);
            UltimaPosLibre = Utilities.LeerEntero(archivo, 1);
            Tamaño         = Utilities.LeerEntero(archivo, 3);
            orden          = Utilities.LeerEntero(archivo, 4);

            if (UltimaPosLibre == Utilities.ApuntadorVacio)
            {
                UltimaPosLibre = 0;
            }
            if (Tamaño == Utilities.ApuntadorVacio)
            {
                Tamaño = 0;
            }
            if (Orden == Utilities.ApuntadorVacio)
            {
                Orden = orden;
            }

            if (Altura == Utilities.ApuntadorVacio)
            {
                Altura = 1;
            }

            if (raiz == Utilities.ApuntadorVacio)
            {
                Nodes <T, int> nodoCabeza = new Nodes <T, int>(Orden, UltimaPosLibre, Utilities.ApuntadorVacio, Creador);
                UltimaPosLibre++;
                raiz = nodoCabeza.Position;
                nodoCabeza.GuardarNodoEnDisco(archivo, Encabezado);
            }

            GuardarEncabezado();
        }
Exemple #11
0
        internal static NodoB <T> LeerNodoDesdeDisco(FileStream archivo, int tamañoEncabezado, int orden, int posicion, IFabricaTextoTamañoFijo <T> fabrica)
        {
            if (archivo == null)
            {
                throw new ArgumentNullException("archivo");
            }

            if (tamañoEncabezado < 0)
            {
                throw new ArgumentOutOfRangeException("tamañoEncabezado");
            }

            if ((orden < OrdenMinimo) || (orden > OrdenMaximo))
            {
                throw new ArgumentOutOfRangeException("orden");
            }

            if (posicion < 0)
            {
                throw new ArgumentOutOfRangeException("posicion");
            }
            if (fabrica == null)
            {
                throw new ArgumentNullException("fabrica");
            }
            // Se crea un nodo nulo para poder acceder a las
            // propiedades de tamaño calculadas sobre la instancia
            // el dato de la instancia del nodo
            NodoB <T> nuevoNodo = new NodoB <T>(orden, posicion, 0, fabrica);

            // Se crea un buffer donde se almacenarán los bytes leidos
            byte[] datosBinario = new byte[nuevoNodo.TamañoEnBytes];

            // Variables a ser utilizadas luego de que el archivo sea leido
            string datosCadena = ""; string[] datosSeparados = null; int PosicionEnDatosCadena = 1;

            // Se ubica la posición donde deberá estar el nodo y se lee desde el archivo
            archivo.Seek(nuevoNodo.CalcularPosicionEnDisco(tamañoEncabezado), SeekOrigin.Begin);
            archivo.Read(datosBinario, 0, nuevoNodo.TamañoEnBytes);

            // Se convierten los bytes leidos del archivo a una cadena
            datosCadena = Utilidades.ConvertirBinarioYTexto(datosBinario);

            // Se quitan los saltos de línea y se separa en secciones
            datosCadena    = datosCadena.Replace(Utilidades.TextoNuevaLinea, "");
            datosCadena    = datosCadena.Replace("".PadRight(3, Utilidades.TextoSeparador), Utilidades.TextoSeparador.ToString());
            datosSeparados = datosCadena.Split(Utilidades.TextoSeparador);

            // Se se obtiene la posición del Padre
            nuevoNodo.Padre = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]);
            PosicionEnDatosCadena++;

            // Se asignan al nodo vacío los hijos desde la cadena separada
            for (int i = 0; i < nuevoNodo.Hijos.Count; i++)
            {
                nuevoNodo.Hijos[i] = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]);
                PosicionEnDatosCadena++;
            }

            // Se asignan al nodo vacío las llaves desde la cadena separada
            for (int i = 0; i < nuevoNodo.Llaves.Count; i++)
            {
                nuevoNodo.Llaves[i] = datosSeparados[PosicionEnDatosCadena];
                PosicionEnDatosCadena++;
            }

            // Se asignan al nodo vacío los datos la cadena separada
            for (int i = 0; i < nuevoNodo.Datos.Count; i++)
            {
                datosSeparados[PosicionEnDatosCadena] = datosSeparados[PosicionEnDatosCadena].Replace(Utilidades.TextoSustitutoSeparador, Utilidades.TextoSeparador);
                nuevoNodo.Datos[i] = fabrica.Fabricar(datosSeparados[PosicionEnDatosCadena]);
                PosicionEnDatosCadena++;
            }

            // Se retorna el nodo luego de agregar toda la información
            return(nuevoNodo);
        }
Exemple #12
0
        //lee el nodo ya existente en el dico
        internal static Nodes <T, Tkey> ReadNodesInDisk(FileStream archivo, int tamañoEncabezado, int orden, int posicion, IFabricaTextoTamañoFijo <T> fabrica)
        {
            if (archivo == null)
            {
                throw new ArgumentNullException("archivo");
            }

            if (tamañoEncabezado < 0)
            {
                throw new ArgumentOutOfRangeException("tamañoEncabezado");
            }

            if ((orden < MinOrder) || (orden > MaxOrder))
            {
                throw new ArgumentOutOfRangeException("orden");
            }

            if (posicion < 0)
            {
                throw new ArgumentOutOfRangeException("posicion");
            }
            if (fabrica == null)
            {
                throw new ArgumentNullException("fabrica");
            }

            Nodes <T, Tkey> newNode = new Nodes <T, Tkey>(orden, posicion, 0, fabrica);

            byte[] datosBinario = new byte[newNode.MemoryInBytes];

            string datosCadena = "";

            string[] datosSeparados        = null;
            int      PosicionEnDatosCadena = 1;

            archivo.Seek(newNode.CalcularPosicionEnDisco(tamañoEncabezado), SeekOrigin.Begin);
            archivo.Read(datosBinario, 0, newNode.MemoryInBytes);
            datosCadena = Utilities.ConvertirBinarioYTexto(datosBinario);

            datosCadena    = datosCadena.Replace(Utilities.TextoNuevaLinea, "");
            datosCadena    = datosCadena.Replace("".PadRight(3, Utilities.TextoSeparador), Utilities.TextoSeparador.ToString());
            datosSeparados = datosCadena.Split(Utilities.TextoSeparador);

            newNode.Father = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]);
            PosicionEnDatosCadena++;

            for (int i = 0; i < newNode.Keys.Count; i++)
            {
                newNode.Keys[i] = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]);
                PosicionEnDatosCadena++;
            }

            for (int i = 0; i < newNode.Keys.Count; i++)
            {
                newNode.Keys[i] = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]);
                PosicionEnDatosCadena++;
            }

            for (int i = 0; i < newNode.Datos.Count; i++)
            {
                datosSeparados[PosicionEnDatosCadena] = datosSeparados[PosicionEnDatosCadena].Replace(Utilidades.TextoSustitutoSeparador, Utilidades.TextoSeparador);
                newNode.Datos[i] = fabrica.Fabricar(datosSeparados[PosicionEnDatosCadena]); PosicionEnDatosCadena++;
            }
            return(newNode);
        }
Exemple #13
0
        internal static Nodo <T> CrearNodoDesdeDisco(FileStream archivo, int tamañoEncabezado, int posicion, IFabricaTextoTamañoFijo <T> fabrica)
        {
            if (archivo == null)
            {
                throw new ArgumentNullException("archivo");
            }
            if (tamañoEncabezado < 0)
            {
                throw new ArgumentOutOfRangeException("tamañoEncabezado");
            }
            if (posicion < 0)
            {
                throw new ArgumentOutOfRangeException("posicion");
            }
            if (fabrica == null)
            {
                throw new ArgumentNullException("fabrica");
            }

            // Se crea un nodo nulo para poder acceder a las propiedades de tamaño calculadas
            // sobre la instancia el dato de la instancia del nodo.
            Nodo <T> nuevoNodo = new Nodo <T>(posicion, fabrica.FabricarNulo());

            // Se cea un buffer donde almacenarán los bytes leidos
            byte[] datosBinario = new byte[nuevoNodo.TamañoEnBytes];

            // Variables a ser utilizadas luego de que el archivo sea leido
            string datosCadena = "";

            string[] datosSeparados = null;

            // Se ubica la posición donde deberá estar el nodo y se lee desde el archivo
            archivo.Seek(nuevoNodo.CalcularPosicionEnDisco(tamañoEncabezado), SeekOrigin.Begin);
            archivo.Read(datosBinario, 0, nuevoNodo.TamañoEnBytes);

            // Se converiten los bytes leidos del archivo a una cadena
            datosCadena = Utilidades.ConvertirBinarioYTexto(datosBinario);

            // Se quitan los saltos de linea y se separa en secciones
            datosCadena    = datosCadena.Replace(Utilidades.TextoNuevaLinea, "");
            datosSeparados = datosCadena.Split(Utilidades.TextoSeparador);

            // Se asignan los apuntadores de Anterior y Siguiente
            nuevoNodo.Anterior  = Convert.ToInt32(datosSeparados[1]);
            nuevoNodo.Siguiente = Convert.ToInt32(datosSeparados[2]);

            // Se regenera el objeto Dato utilizando la fabrica
            nuevoNodo.Anterior  = Convert.ToInt32(datosSeparados[1]);
            nuevoNodo.Siguiente = Convert.ToInt32(datosSeparados[2]);

            // Se retorna el nodo luego de agregar toda la información
            return(nuevoNodo);
        }