public void EscribirPadre(int _idPadre, NodoProducto PadreNuevo) { var file = new FileStream(GlobalPath, FileMode.Open); var reader = new StreamReader(file); var linea = string.Empty; var index = file.Position; for (int i = 0; i < _idPadre; i++) { linea = reader.ReadLine(); index += linea.Length + 1; } file.Position = index + 2; int indicearchivo = Convert.ToInt32(index); //sobre escribe el hijo SortDatos(PadreNuevo.Datos); file.Write(Encoding.ASCII.GetBytes(PadreNuevo.WriteNodo()), 0, (PadreNuevo.WriteNodo()).Length); file.Close(); }
public void Insertar(Producto Nuevo) { var FILE = new FileStream(GlobalPath, FileMode.Open); var lector = new StreamReader(FILE); if (IdPAdre == 1 && !primeraSeparecion) // aun no se parte { var linea = lector.ReadLine(); linea = lector.ReadLine(); FILE.Close(); Raiz = Raiz.ReadNodo(linea); var contador = 0; for (int i = 0; i <= Raiz.Datos.Length; i++) { if (i == Raiz.Datos.Length) { PrimeraSeparacion(Raiz, Nuevo); break; } //insertando en la raiz if (Raiz.Datos[i] == null) { Raiz.Datos[contador] = Nuevo; SortDatos(Raiz.Datos); var escritor = new StreamWriter(GlobalPath); escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" + $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" + $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}"); escritor.WriteLine(Raiz.WriteNodo()); escritor.Close(); break; } else { contador++; } } } else { FILE.Close(); InsertarEnHoja(SeekPadre(IdPAdre), Nuevo); } }
//idpadre|grado|siguiente|tamañopadre|tamañohijo public ArbolStar(int _grado, string _path) { var file = new FileStream(_path, FileMode.OpenOrCreate); var lector = new StreamReader(file); var linea = lector.ReadLine(); GlobalPath = _path; if (linea == null) {//nuevo arbol LargoPadre = new NodoProducto(_grado, false).WriteNodo().Length; LargoHijo = new NodoProducto(_grado, true).WriteNodo().Length; IdPAdre = 1; Siguiente = IdPAdre + 1; Grado = _grado; Raiz = new NodoProducto(Grado, false); lector.Close(); var escritor = new StreamWriter(GlobalPath); Raiz.id = IdPAdre; Raiz.Grado = _grado; Raiz.esHoja = false; escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" + $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" + $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}|"); escritor.WriteLine(Raiz.WriteNodo()); escritor.Close(); } else {//arbol cargado var aMetaData = linea.Split('|'); //0raiz IdPAdre = int.Parse(aMetaData[0]); //1grado Grado = int.Parse(aMetaData[1]); //2siguiente Siguiente = int.Parse(aMetaData[2]); //3largo padre LargoPadre = int.Parse(aMetaData[3]); //4largohijo LargoHijo = int.Parse(aMetaData[4]); Raiz = new NodoProducto(_grado, false); } file.Close(); }
public void PrimeraSeparacion(NodoProducto Actual, Producto Nuevo) { var lista = new List <Producto>(); foreach (var item in Actual.Datos) { lista.Add(item); } lista.Add(Nuevo); // escribir en el archivo todos los nodos disponibles del padre e hijos var hijo1 = new NodoProducto(Grado, true) { Grado = Grado }; hijo1.id = IdPAdre; var indice = 0; for (int i = 0; i < lista.Count / 2; i++) { hijo1.Datos[indice] = lista[i]; indice++; } indice = 0; var hijo2 = new NodoProducto(Grado, true); hijo2.id = Siguiente; Siguiente++; for (int i = (lista.Count / 2) + 1; i < lista.Count; i++) { hijo2.Datos[indice] = lista[i]; indice++; } var raiznueva = new NodoProducto(Grado, false) { id = Siguiente }; lista.Sort((x, y) => x.Nombre.CompareTo(y.Nombre)); raiznueva.Datos[0] = lista[(lista.Count / 2) + 1]; IdPAdre = Siguiente; raiznueva.Hijos[0] = hijo1.id; raiznueva.Hijos[1] = hijo2.id; hijo1.Padre = raiznueva.id; hijo2.Padre = raiznueva.id; Siguiente++; SortDatos(raiznueva.Datos); SortDatos(hijo1.Datos); SortDatos(hijo2.Datos); var escritor = new StreamWriter(GlobalPath); //metadata escritor.WriteLine($"{(IdPAdre).ToString().PadLeft(3, '0')}" + $"|{Grado.ToString().PadLeft(3, '0')}|{Siguiente.ToString().PadLeft(3, '0')}" + $"|{LargoPadre.ToString().PadLeft(3, '0')}|{LargoHijo.ToString().PadLeft(3, '0')}|"); // nodos escritor.WriteLine(hijo1.WriteNodo()); escritor.WriteLine(hijo2.WriteNodo()); escritor.WriteLine(raiznueva.WriteNodo()); escritor.Close(); }