public static FPath Directories(this FPath p, Predicate <FPath> predicate, bool recursive, bool shortcutRecursion)
        {
            if (!recursive || !shortcutRecursion)
            {
                return(p.Directories(predicate, recursive));
            }

            var result   = new FPath();
            var dirQueue = new Queue <FPath>();

            dirQueue.Enqueue(p);
            while (dirQueue.Count > 0)
            {
                var dir = dirQueue.Dequeue();
                foreach (var childDir in dir.Directories(predicate, false))
                {
                    dirQueue.Enqueue(childDir);
                    result = result.Add(childDir);
                }
            }
            return(result);
        }
 static FPath Directories(this FPath p, string searchPattern) => p.Directories(searchPattern, false);