/**Copia toda la lista de bloques al nuevo archivo*/ public void CopiarSec(CArchivo fileOri, CArchivo fileNew, long dirEnt, int tamBloque, ref List<CBloque> listBloque) { CBloque bloqueAux, bloqueNuevo; while (dirEnt != -1) { bloqueAux = fileOri.leerBloque(dirEnt, tamBloque); bloqueNuevo = new CBloque(); bloqueNuevo.setBloque(bloqueAux.getBloque()); bloqueNuevo.setTamBlo(tamBloque); bloqueNuevo.setDir(fileNew.ENDF()); fileNew.EscribeBloque(bloqueNuevo, fileNew.ENDF()); listBloque.Add(bloqueNuevo); dirEnt = bloqueAux.getSigBlo(); } for (int i = 0; i < listBloque.Count - 1; i++) { listBloque[i].setSigBlo(listBloque[i + 1].getDir()); fileNew.EscribeBloque(listBloque[i], listBloque[i].getDir()); } }
/**Crea cada uno de los nodos de arbol en forma recursiva, asindo un recorrido en preorden * y va agranagando todos estos nodos al nuevo archivo*/ public long generaArbolRec(CArchivo aO, CArchivo aD, int tamBloque, long dirCab) { CNodo nodoAux, nuevoNodo; CBloque bloqueAux,bloqueNuevo; long dirNodo = -1; int LS; if (dirCab != -1) { nodoAux = aO.leerNodo(dirCab); nuevoNodo = creaNodo(aO,aD,nodoAux); if (nodoAux.getTipoNodo() == HOJA || nodoAux.getTipoNodo() == RAIZHOJA) LS = nodoAux.getNumElemnt(); else LS = nodoAux.getNumElemnt() + 1; for (int i = 0; i < LS; i++) if (nodoAux.getTipoNodo() == HOJA || nodoAux.getTipoNodo() == RAIZHOJA) { bloqueAux = aO.leerBloque(nodoAux.getAtDirNodo(i), tamBloque); bloqueNuevo = new CBloque(); bloqueNuevo.setBloque(bloqueAux.getBloque()); bloqueNuevo.setTamBlo(tamBloque); bloqueNuevo.setDir(aD.ENDF()); aD.EscribeBloque(bloqueNuevo, aD.ENDF()); nuevoNodo.setAtDirNodo(i, bloqueNuevo.getDir()); } else nuevoNodo.setAtDirNodo(i,generaArbolRec(aO,aD,tamBloque,nodoAux.getAtDirNodo(i))); aD.escribeNodo(nuevoNodo); dirNodo = nuevoNodo.getDir(); } return(dirNodo); }
/** \brief Alta de un registro*/ public bool AltaOS() { long ptrAux, ptrAnt = 0; bool res = false; bool band = true; CBloque bloqueAux, bloqueAnt = null; getArchivo().AbrirArchivo(); ptrAux = ent.getApCabDatos(); //Se busca en la ubicacion del bloque en el archivo. while (ptrAux != -1 && band == true && res == false) { bloqueAux = getArchivo().leerBloque(ptrAux, tamBloque); bloqueAux.setTamBlo(tamBloque); switch(bloque.ComparateTo(bloqueAux)) { case -1: res = band = true; break; case 0: res = band = false; break; case 1: ptrAnt = ptrAux; bloqueAnt = bloqueAux; ptrAux = bloqueAux.getSigBlo(); break; } } if (band == true)//No hay bloques repetidos { if (ptrAux == ent.getApCabDatos())//Se insertara en la primera posición { ent.setApCabDatos(getArchivo().ENDF()); getArchivo().escribeEntidad(ent, ent.getDir()); } else { bloqueAnt.setSigBlo(getArchivo().ENDF()); getArchivo().EscribeBloque(bloqueAnt, ptrAnt); } } bloque.setSigBlo(ptrAux); getArchivo().EscribeBloque(bloque, getArchivo().ENDF()); getArchivo().CerrarArchivo(); return (res); }