public static IEnumerable <FileSystemItem> GetItems(this DirectoryItem directoryItem, Predicate <FileSystemItem> predicate)
        {
            var elements = new Stack <DirectoryItem>();

            elements.Push(directoryItem);

            while (elements.Any())
            {
                var currentElement = elements.Pop();

                if (predicate(currentElement))
                {
                    yield return(currentElement);
                }

                foreach (var item in currentElement.Elements)
                {
                    if (predicate(item))
                    {
                        yield return(item);
                    }

                    if (item.GetType() == typeof(DirectoryItem))
                    {
                        elements.Push((DirectoryItem)item);
                    }
                }
            }
        }
        public FileSystemBuilder AddDirectory(string name)
        {
            var dir = new DirectoryItem(name);

            this.currentDirectory.Add(dir);
            this.currentDirectory = dir;
            return(this);
        }
        public FileSystemBuilder SetCurrentDirectory(string directoryName)
        {
            var elements = new Stack <DirectoryItem>();

            elements.Push(Root);

            while (elements.Any())
            {
                var currentElement = elements.Pop();

                if (currentElement.Name == directoryName)
                {
                    currentDirectory = currentElement;
                    return(this);
                }

                foreach (var directoryItem in currentElement.Elements.OfType <DirectoryItem>())
                {
                    elements.Push(directoryItem);
                }
            }

            throw new Exception("Directory not found");
        }
 public FileSystemBuilder(string rootDirectory)
 {
     Root             = new DirectoryItem(rootDirectory);
     currentDirectory = Root;
 }