如何用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
相关产品推荐
相关产品推荐

