public Subnode GetSubnode(uint subnodeID)
        {
            SubnodeLeafEntry entry = GetLeafEntry(subnodeID);

            if (entry != null)
            {
                Subnode result = Subnode.GetSubnode(this.File, entry);
                return(result);
            }
            return(null);
        }
        public int GetDataLengthOfAllSubnodes()
        {
            List <SubnodeLeafBlock> leaves = GetLeafBlocks();
            int result = 0;

            foreach (SubnodeLeafBlock leaf in leaves)
            {
                foreach (SubnodeLeafEntry entry in leaf.rgentries)
                {
                    Subnode subnode = Subnode.GetSubnode(this.File, entry);
                    result += subnode.DataTree.TotalDataLength;
                    if (subnode.SubnodeBTree != null)
                    {
                        result += subnode.SubnodeBTree.GetDataLengthOfAllSubnodes();
                    }
                }
            }
            return(result);
        }
        public void Delete()
        {
            List <SubnodeLeafBlock> leaves = GetLeafBlocks();

            foreach (SubnodeLeafBlock leaf in leaves)
            {
                foreach (SubnodeLeafEntry entry in leaf.rgentries)
                {
                    Subnode subnode = Subnode.GetSubnode(this.File, entry);
                    subnode.Delete();
                }
                DeleteBlock(leaf);
            }

            // we could have already deleted our root block (if it's a leaf)
            if (m_rootBlock is SubnodeIntermediateBlock)
            {
                DeleteBlock(m_rootBlock);
            }
            m_rootBlock = null;

            SaveChanges();
        }