public static boolean iterateChildrenRecursively(@NotNull VirtualFile root,
                                                   @Nullable VirtualFileFilter filter,
                                                   @NotNull ContentIterator iterator,
                                                   VirtualFileVisitor.Option @NotNull ... options) {
    VirtualFileVisitor.Result result = visitChildrenRecursively(root, new VirtualFileVisitor<Void>(options) {
      @Override
      public @NotNull Result visitFileEx(@NotNull VirtualFile file) {
        if (filter != null && !filter.accept(file)) return SKIP_CHILDREN;
        if (!iterator.processFile(file)) return skipTo(root);
        return CONTINUE;
      }
    });
    return !Comparing.equal(result.skipToParent, root);
  }
public static boolean iterateChildrenRecursively(@NotNull VirtualFile root,
                                                   @Nullable VirtualFileFilter filter,
                                                   @NotNull ContentIterator iterator,
                                                   VirtualFileVisitor.Option @NotNull ... options)