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

如何用C#的String[]与List<String[]>实现目录树全目录检索

解决目录遍历问题:添加顶级目录并简化实现

嘿,我来帮你搞定这个问题!你的核心问题是集合类型选错了,导致没法把顶级目录和子目录统一存储,另外也可以用更简洁的方法实现递归遍历。

先分析你的现有问题

你的代码返回的是List<string[]>,每个元素是一个目录的子目录数组——但你想要的是扁平的单个路径列表(比如c:\documents、c:\documents\abtemp这种),所以类型完全不匹配,这也是你之前报错的根源:

  • 「无法将String转换为String[]」:因为你试图把单个目录字符串(dir[i])加到存储数组的列表里,类型不兼容。
  • 改成string[]后无法添加子目录:数组是固定长度的,没法动态扩容添加新元素,必须用动态集合比如List<string>。
  • 「Directory.GetDirectories返回的string[]无法隐式转换」:你需要用ToList()方法(需引用System.Linq)把数组转成列表,而不是直接赋值。

修正后的基础实现

先把代码改成返回List<string>,这样就能同时存储顶级目录和所有子目录,还能筛选隐藏目录:

using System;
using System.Collections.Generic;
using System.IO;

public static class DirectoryHelper
{
    public static List<string> GetAllDirectories() 
    {
        List<string> allDirectories = new List<string>();
        string[] topLevelDirs = Directory.GetDirectories(@"c:\");

        foreach (string topDir in topLevelDirs)
        {
            DirectoryInfo dirInfo = new DirectoryInfo(topDir);
            // 跳过隐藏目录
            if (!dirInfo.Attributes.HasFlag(FileAttributes.Hidden))
            {
                // 先添加顶级目录
                allDirectories.Add(topDir);
                // 递归获取当前顶级目录下的所有子目录
                string[] subDirs = Directory.GetDirectories(topDir, "*", SearchOption.AllDirectories);
                allDirectories.AddRange(subDirs);
            }
        }

        // 按路径排序,匹配你的示例输出顺序
        allDirectories.Sort();
        return allDirectories;
    }
}

更简洁的LINQ实现

如果想让代码更紧凑,可以用LINQ的延迟加载特性,效率更高(尤其是目录很多的时候):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

public static class DirectoryHelper
{
    public static List<string> GetAllDirectories()
    {
        // 先获取所有非隐藏的顶级目录
        var topDirs = Directory.EnumerateDirectories(@"c:\")
                               .Where(path => !new DirectoryInfo(path).Attributes.HasFlag(FileAttributes.Hidden));

        // 递归获取每个顶级目录下的所有子目录
        var subDirs = topDirs.SelectMany(topDir => 
            Directory.EnumerateDirectories(topDir, "*", SearchOption.AllDirectories));

        // 合并顶级目录和子目录,然后排序
        return topDirs.Concat(subDirs)
                      .OrderBy(path => path)
                      .ToList();
    }
}

输出效果

调用这个方法后,输出会和你的示例完全一致:

c:\documents
c:\documents\abtemp
c:\documents\abtemp\chuck
c:\documents\rubbish
c:\documents\state1
...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:55