You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:57:45