如何获取包含文件夹与文件的目录父子层级(树形)结构?
实现目录树形结构的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); }
代码说明:
- 区分文件与目录:用
EnumerateFiles和EnumerateDirectories分别处理文件和目录,避免混合处理的麻烦; - 递归构建树形:子目录节点的
Children通过递归调用GetTreeList自身来生成,自动嵌套出层级结构; - 延迟加载优化:使用
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
相关产品推荐
相关产品推荐

