如何递归显示所有文件和子文件夹?
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);
要检索您可以使用此服务的所有文档
或者您可以创建自定义网络脚本并递归地获取节点,例如:
/**
*
* @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);
}
}
我正在使用 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);
要检索您可以使用此服务的所有文档
或者您可以创建自定义网络脚本并递归地获取节点,例如:
/**
*
* @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);
}
}