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); }
//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); }