Kentico 12 Portal Engine内容树文档库文件夹结构及文件导出方案咨询
导出Kentico 12 Portal Engine文档库完整结构方案
方案1:SQL查询直接导出
Kentico中内容树的层级由CMS_Tree表的NodeID和NodeParentID维护,文档库的文件夹对应CMS_Document中文档类型为CMS.Folder的记录,文件对应文档类型为CMS.DocumentLibraryItem的记录,文件的实际信息存储在CMS_File表中,关联字段是CMS_DocumentLibraryItem.DocumentLibraryItemFileID和CMS_File.FileID。
以下是递归查询完整结构的SQL语句,可直接在SQL Server中执行,导出结果为CSV等格式:
WITH DocumentLibraryHierarchy AS ( -- 根节点:替换为你的文档库根NodeID(可通过CMS Desk内容树地址栏nodeid参数获取) SELECT t.NodeID, t.NodeParentID, d.DocumentName AS ItemName, 'Folder' AS ItemType, CAST(d.DocumentName AS VARCHAR(MAX)) AS FullPath, 1 AS Level FROM CMS_Tree t JOIN CMS_Document d ON t.NodeID = d.DocumentNodeID WHERE t.NodeID = [你的文档库根NodeID] AND d.DocumentClassName = 'CMS.Folder' UNION ALL -- 递归子节点 SELECT child.NodeID, child.NodeParentID, CASE WHEN d.DocumentClassName = 'CMS.Folder' THEN d.DocumentName ELSE f.FileName END AS ItemName, CASE WHEN d.DocumentClassName = 'CMS.Folder' THEN 'Folder' ELSE 'File' END AS ItemType, CAST(parent.FullPath + '\' + CASE WHEN d.DocumentClassName = 'CMS.Folder' THEN d.DocumentName ELSE f.FileName END AS VARCHAR(MAX)) AS FullPath, parent.Level + 1 AS Level FROM CMS_Tree child JOIN CMS_Document d ON child.NodeID = d.DocumentNodeID LEFT JOIN CMS_DocumentLibraryItem dli ON d.DocumentID = dli.DocumentLibraryItemDocumentID LEFT JOIN CMS_File f ON dli.DocumentLibraryItemFileID = f.FileID JOIN DocumentLibraryHierarchy parent ON child.NodeParentID = parent.NodeID ) SELECT FullPath, ItemType, ItemName FROM DocumentLibraryHierarchy ORDER BY FullPath;
说明
- 替换
[你的文档库根NodeID]:在CMS Desk打开目标文档库,查看地址栏的nodeid参数,或在CMS_Tree表中通过NodeAliasPath定位根节点。 - 查询结果包含完整路径、类型(文件夹/文件)、名称,可直接导出为Excel或CSV。
方案2:自定义C#代码导出
如果需要更灵活的输出格式(如JSON、XML),可编写自定义代码遍历内容树:
步骤1:获取文档库根节点
// 替换为文档库根节点的NodeAliasPath TreeNode rootNode = DocumentHelper.GetDocuments() .Path("/Your-Document-Library-Path", PathTypeEnum.Single) .FirstOrDefault(); if (rootNode == null) return;
步骤2:递归遍历节点生成结构
List<LibraryItem> libraryItems = new List<LibraryItem>(); TraverseNode(rootNode, "", libraryItems); // 示例:导出为CSV using (StreamWriter writer = new StreamWriter("DocumentLibraryStructure.csv")) { writer.WriteLine("FullPath,ItemType,Name"); foreach (var item in libraryItems) { writer.WriteLine($"{item.FullPath},{item.ItemType},{item.Name}"); } } // 递归遍历辅助方法 void TraverseNode(TreeNode node, string parentPath, List<LibraryItem> items) { string currentPath = string.IsNullOrEmpty(parentPath) ? node.DocumentName : $"{parentPath}\\{node.DocumentName}"; if (node.ClassName.Equals("CMS.Folder", StringComparison.OrdinalIgnoreCase)) { items.Add(new LibraryItem { FullPath = currentPath, ItemType = "Folder", Name = node.DocumentName }); // 遍历子节点 foreach (TreeNode childNode in node.Children) { TraverseNode(childNode, currentPath, items); } } else if (node.ClassName.Equals("CMS.DocumentLibraryItem", StringComparison.OrdinalIgnoreCase)) { DocumentLibraryItem fileNode = node as DocumentLibraryItem; if (fileNode?.File != null) { items.Add(new LibraryItem { FullPath = currentPath, ItemType = "File", Name = fileNode.File.FileName }); } } } // 数据模型 public class LibraryItem { public string FullPath { get; set; } public string ItemType { get; set; } public string Name { get; set; } }
说明
- 代码可放在自定义Web部件、控制台程序或Kentico自定义模块中执行,需引用
CMS.DocumentEngine.dll、CMS.Libraries.dll等核心程序集。
核心表关联逻辑
CMS_Tree:维护内容树层级,NodeID为节点唯一标识,NodeParentID关联父节点。CMS_Document:存储节点文档属性,DocumentNodeID关联CMS_Tree.NodeID,DocumentClassName区分文件夹(CMS.Folder)和文件(CMS.DocumentLibraryItem)。CMS_DocumentLibraryItem:文档库文件扩展属性,DocumentLibraryItemDocumentID关联CMS_Document.DocumentID,DocumentLibraryItemFileID关联CMS_File.FileID。CMS_File:存储文件实际信息(文件名、路径、大小等)。
内容的提问来源于stack exchange,提问作者Rakesh Pinnamaneni
相关产品推荐
相关产品推荐

