예제 #1
0
파일: NodoB.cs 프로젝트: hermask8/Proyecto
        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);
        }
예제 #2
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);
        }