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

如何获取包含文件夹与文件的目录父子层级(树形)结构?

实现目录树形结构的GetTreeList方法

当然可以用LINQ结合递归来实现这个需求,直接上代码:

public IEnumerable<Item> GetTreeList(DirectoryInfo rootDir)
{
    // 枚举当前目录下的所有文件,转换为Item节点
    var fileItems = rootDir.EnumerateFiles()
        .Select(file => new Item
        {
            Name = file.Name,
            isDirectory = false,
            Children = Enumerable.Empty<Item>()
        });

    // 枚举当前目录下的所有子目录,递归生成子节点树
    var dirItems = rootDir.EnumerateDirectories()
        .Select(dir => new Item
        {
            Name = dir.Name,
            isDirectory = true,
            Children = GetTreeList(dir)
        });

    // 合并目录节点和文件节点,返回当前层级的所有节点
    return dirItems.Concat(fileItems);
}

代码说明:

  1. 区分文件与目录:用EnumerateFiles和EnumerateDirectories分别处理文件和目录,避免混合处理的麻烦;
  2. 递归构建树形:子目录节点的Children通过递归调用GetTreeList自身来生成,自动嵌套出层级结构;
  3. 延迟加载优化:使用Enumerate系列方法而非Get系列,会按需加载文件系统信息,在处理大目录时性能更优。

补充:处理权限异常

如果遇到无法访问的目录(比如权限不足),可以在递归时添加异常捕获,避免整个方法崩溃:

public IEnumerable<Item> GetTreeList(DirectoryInfo rootDir)
{
    var fileItems = rootDir.EnumerateFiles()
        .Select(file => new Item
        {
            Name = file.Name,
            isDirectory = false,
            Children = Enumerable.Empty<Item>()
        });

    var dirItems = rootDir.EnumerateDirectories()
        .Select(dir => 
        {
            try
            {
                return new Item
                {
                    Name = dir.Name,
                    isDirectory = true,
                    Children = GetTreeList(dir)
                };
            }
            catch (UnauthorizedAccessException)
            {
                // 可以返回一个标记无法访问的节点,或者直接跳过
                return new Item
                {
                    Name = $"{dir.Name} (无法访问)",
                    isDirectory = true,
                    Children = Enumerable.Empty<Item>()
                };
            }
        });

    return dirItems.Concat(fileItems);
}

你之前得到扁平结构,是因为只枚举了当前层级的文件和目录,没有递归处理子目录的嵌套关系,通过LINQ的Select结合递归调用,就能轻松生成树形层级结构。

内容的提问来源于stack exchange,提问作者guyman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:35:30