使用C# GetDirectories()遍历指定层数子目录的问题
问题分析与解决方案
你的代码问题不是DirectoryInfo.GetDirectories()默认只返回一个子目录,而是循环逻辑完全偏离了“遍历指定层数子目录”的需求:
GetDirectories()默认会返回当前目录下的所有一级子目录,不存在只返回一个的默认设置。你可以直接打印subDirectories.Length验证实际子目录数量。- 你当前的循环逻辑是:每遍历一个一级子目录就减
depthCounter,减到0就跳出循环。比如用户要遍历2层,你只会遍历前2个一级子目录就停止,完全没有递归深入到子目录的下一层,根本没实现“指定层数遍历”的目标。
正确实现方式
要实现按指定深度遍历子目录,需要用递归或**迭代(队列/栈)**的方式,跟踪当前遍历的深度,当深度达到指定值时停止深入。
方法1:递归实现
适合深度不大的场景,代码简洁直观:
public static void TraverseDirectories(string path, int maxDepth) { // 这里可添加对当前目录的处理逻辑,比如记录路径 Console.WriteLine($"当前目录:{path}"); // 已达到最大深度,停止递归 if (maxDepth <= 0) return; DirectoryInfo dirInfo = new DirectoryInfo(path); foreach (DirectoryInfo subDir in dirInfo.GetDirectories()) { // 递归遍历子目录,深度减1 TraverseDirectories(subDir.FullName, maxDepth - 1); } }
调用示例(遍历2层子目录):
TraverseDirectories(@"D:\Test", 2);
方法2:迭代实现(队列)
适合深度较大的场景,避免递归栈溢出:
public static void TraverseDirectoriesIterative(string rootPath, int maxDepth) { // 队列存储待遍历的目录和当前深度 Queue<(string DirPath, int CurrentDepth)> dirQueue = new Queue<(string, int)>(); dirQueue.Enqueue((rootPath, 0)); while (dirQueue.Count > 0) { var (currentPath, currentDepth) = dirQueue.Dequeue(); // 处理当前目录 Console.WriteLine($"当前目录:{currentPath}"); // 未达到最大深度,继续添加子目录到队列 if (currentDepth < maxDepth) { DirectoryInfo dirInfo = new DirectoryInfo(currentPath); foreach (DirectoryInfo subDir in dirInfo.GetDirectories()) { dirQueue.Enqueue((subDir.FullName, currentDepth + 1)); } } } }
调用示例:
TraverseDirectoriesIterative(@"D:\Test", 2);
补充说明
- 如果需要筛选子目录(比如只找特定名称的目录),可以使用
GetDirectories()的重载方法,例如dirInfo.GetDirectories("*test*")匹配名称含test的目录。 - 默认
GetDirectories()只会返回当前目录的一级子目录(SearchOption.TopDirectoryOnly),如果要一次性获取所有层级的子目录,可以用dirInfo.GetDirectories("*", SearchOption.AllDirectories),但这无法控制遍历深度,所以还是需要自己实现深度控制逻辑。
内容的提问来源于stack exchange,提问作者CodingM
相关产品推荐
相关产品推荐

