如何递归显示所有文件和子文件夹?

How do I recursively display all files and subfolders?

我正在使用 Alfresco Rest Api,但我找不到任何选项可以 return 包含所有子文件夹的整个目录树。

我想转到最后一个文件,即使它在 3 个子文件夹中 'wrapped'。

有什么想法吗?

我认为你做不到。

虽然您可以执行 PATH 查询,因为它也可以用 return 所有 children 的方式编写。

例如:

var folder = search.luceneSearch("+PATH:\"/app:company_home/cm:Test_x0020_Folder//*\" AND (TYPE:\"cm:content\" OR TYPE:\"cm:folder\")");

创建一个 java 烘焙的网络脚本,它将 return 下面的节点 object。

public class ReportNode {

    private NodeRef currentNode;
    private List<ReportNode> children;
    private Map<String, String> properties = new HashMap<>();
    private boolean isFolder;
    private String name;
    private String type;
    private List<String> aspects;
//Getter Setters
}

在上面的结构中
currentNode表示list中的当前nodered
children表示节点children

其他的都很好理解

通过节点爬取将上述链表结构中的数据填满

显示爬取的data.You可以使用下面的freemarker模板。

<#macro recurse_macro nodeRef>
    <ul>
        <li> 
                <@print_properties reportNode=nodeRef/>
        </li>
     </ul>
</#macro>

<#macro print_properties reportNode>
        <ul>
            <li> 
                <a>Properties</a>
                    <ul>
                        <#list reportNode.properties?keys as key> 
                                        <li>${key} : ${reportNode.properties[key]}
                        </#list>

                    </ul>
            </li>
         </ul>
</#macro>

<@recurse_macro nodeRef=nodeRef/>

其中noderef是通过爬取节点创建的链表的根节点。

请参阅 categoryService 以列出任何嵌套子文件夹中的所有文件。这里 nodeRef 是父文件夹的 noderef

使用 categoryService 也可以列出一个文件夹的所有子文件夹。

Collection<ChildAssociationRef> children = categoryService.getChildren(new NodeRef(nodeRef), CategoryService.Mode.ALL, CategoryService.Depth.ANY);

要检索您可以使用此服务的所有文档

http://localhost:8080/share/service/components/documentlibrary/data/doclist/all/site/XXXX/documentLibrary?filter=all&noCache=1521477198549

或者您可以创建自定义网络脚本并递归地获取节点,例如:

/**
 * 
 * @param type
 * @param nodeRef
 * @return true if node type equals or inherit from type <code>type</code>
 */
protected boolean hasSubType(QName type, NodeRef nodeRef) {
    List<QName> subTypes = new ArrayList<>();
    subTypes.addAll(dictionaryService.getSubTypes(type, true));
    QName nodeType = nodeService.getType(nodeRef);
    return nodeType.equals(type) || subTypes.contains(nodeType);
}

private void getNodesRecursive(NodeRef node, List<NodeRef> documents) {
    if (hasSubType(ContentModel.TYPE_FOLDER, node)) {
        List<ChildAssociationRef> children = nodeService.getChildAssocs(node, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
        for (ChildAssociationRef child : children) {
            NodeRef childNode = child.getChildRef();
            if (hasSubType(ContentModel.TYPE_CONTENT, node)) {
                documents.add(childNode);
            } else if (hasSubType(ContentModel.TYPE_FOLDER, node)) {
                // documents.add(childNode);
                getNodesRecursive(childNode, documents);
            }
        }
    } else {
        documents.add(node);
    }
}