public bool IsValidMoveCopy(AIONode nodeToMoveCopy, AIONode nodeToAttach)
        {
            if (nodeToMoveCopy.Equals(nodeToAttach))             //Truong hop 2 node trung nhau
            {
                return(false);
            }

            return(IsValidMoveCopy_R(nodeToMoveCopy.childNode, nodeToAttach));
        }
        public void DeleteNode(AIONode nodeToDelete)
        {
            //Check if nodeToDelete is rootNode
            if (nodeToDelete.Equals(root))
            {
                throw new AIOException(AIOExceptionType.CANNOT_DELETE_ROOT);
            }

            deleteNode = true;
            //Count
            int [] minus = Count(nodeToDelete);
            deleteNode = false;

            foldersCount -= minus[0];
            filesCount   -= minus[1];

            AIONode previousNode = nodeToDelete.prevNode;

            if (previousNode != null)             //Not to delete the root
            {
                bool previousIsParent = nodeToDelete.prevIsParent;
                if (previousIsParent)
                {
                    previousNode.childNode = nodeToDelete.nextNode;
                }
                else
                {
                    previousNode.nextNode = nodeToDelete.nextNode;
                }

                if (nodeToDelete.nextNode != null)
                {
                    nodeToDelete.nextNode.prevIsParent = previousIsParent;
                    nodeToDelete.nextNode.prevNode     = previousNode;
                }
            }

            //Delete
            nodeToDelete = null;

            //Execute Queue Command
            aioDb.ExecuteQueueCommand();
        }
        //De quy vao cac con de kiem tra destination co phai con cua source hay ko
        private bool IsValidMoveCopy_R(AIONode subroot, AIONode nodeToAttach)
        {
            if (subroot == null)
            {
                return(true);
            }
            if (subroot.Equals(nodeToAttach)) //Invalid
            {
                return(false);
            }
            bool valid = IsValidMoveCopy_R(subroot.childNode, nodeToAttach);

            if (!valid)
            {
                return(false);
            }
            valid = IsValidMoveCopy_R(subroot.nextNode, nodeToAttach);
            if (!valid)
            {
                return(false);
            }
            return(true);
        }
 //De quy vao cac con de kiem tra destination co phai con cua source hay ko
 private bool IsValidMoveCopy_R(AIONode subroot, AIONode nodeToAttach)
 {
     if (subroot == null) return true;
     if (subroot.Equals(nodeToAttach)) //Invalid
         return false;
     bool valid = IsValidMoveCopy_R(subroot.childNode, nodeToAttach);
     if (!valid) return false;
     valid = IsValidMoveCopy_R(subroot.nextNode, nodeToAttach);
     if (!valid) return false;
     return true;
 }
        public bool IsValidMoveCopy(AIONode nodeToMoveCopy, AIONode nodeToAttach)
        {
            if (nodeToMoveCopy.Equals(nodeToAttach)) //Truong hop 2 node trung nhau
                return false;

            return IsValidMoveCopy_R(nodeToMoveCopy.childNode, nodeToAttach);
        }
        public void DeleteNode(AIONode nodeToDelete)
        {
            //Check if nodeToDelete is rootNode
            if (nodeToDelete.Equals(root)) {
                throw new AIOException(AIOExceptionType.CANNOT_DELETE_ROOT);
            }

            deleteNode = true;
            //Count
            int [] minus = Count(nodeToDelete);
            deleteNode = false;

            foldersCount -= minus[0];
            filesCount -= minus[1];

            AIONode previousNode = nodeToDelete.prevNode;

            if (previousNode != null) //Not to delete the root
            {
                bool previousIsParent = nodeToDelete.prevIsParent;
                if (previousIsParent)
                {
                    previousNode.childNode = nodeToDelete.nextNode;
                }
                else
                {
                    previousNode.nextNode = nodeToDelete.nextNode;
                }

                if (nodeToDelete.nextNode != null)
                {
                    nodeToDelete.nextNode.prevIsParent = previousIsParent;
                    nodeToDelete.nextNode.prevNode = previousNode;
                }
            }

            //Delete
            nodeToDelete = null;

            //Execute Queue Command
            aioDb.ExecuteQueueCommand();
        }