C#中搜索指定子目录(XYZ、ABC)并获取其文件名称的方法
解决方法:查找指定子目录并提取其中的文件名
嘿,我来帮你搞定这个问题!你现在的代码有个小坑——Directory.GetDirectories(root)返回的是完整路径(比如C:\YourRoot\XYZ),直接用Equals("XYZ")肯定匹配不上,得先提取目录名再判断。另外你要同时找XYZ和ABC两个目录,我给你一步步梳理:
第一步:修正目标目录的查找逻辑
先把要找的目录名存起来,然后通过Path.GetFileName()提取每个目录的名称,再判断是否在目标列表里:
string rootPath = @"你的根目录完整路径"; // 比如 @"C:\MyRootFolder" // 用HashSet存储目标目录名,查找效率更高 var targetDirNames = new HashSet<string> { "XYZ", "ABC" }; // 筛选出根目录下的目标子目录 IEnumerable<string> targetDirectories = Directory.GetDirectories(rootPath) .Where(dir => targetDirNames.Contains(Path.GetFileName(dir)));
第二步:遍历目录获取文件名
找到目标目录后,用Directory.GetFiles()就能获取里面的文件了。这里分两种常用情况:
情况1:只获取当前目录下的文件(不含子目录)
foreach (var dir in targetDirectories) { Console.WriteLine($"=== 处理目录: {dir} ==="); // 获取当前目录下所有文件的完整路径 string[] files = Directory.GetFiles(dir); foreach (var filePath in files) { // 如果你只需要文件名(不带路径),用Path.GetFileName() string fileName = Path.GetFileName(filePath); Console.WriteLine($"找到文件: {fileName}"); // 要是需要完整路径,直接用filePath就行 } }
情况2:获取目录及所有子目录下的文件
如果要递归查找子目录里的文件,给GetFiles加个SearchOption.AllDirectories参数:
foreach (var dir in targetDirectories) { Console.WriteLine($"=== 处理目录(含子目录): {dir} ==="); string[] allFiles = Directory.GetFiles(dir, "*", SearchOption.AllDirectories); foreach (var filePath in allFiles) { string fileName = Path.GetFileName(filePath); Console.WriteLine($"找到文件: {fileName}"); } }
关键注意点
- 一定要用
Path.GetFileName()提取目录名,避免完整路径匹配失败的问题 - 用
HashSet存储目标目录名,比普通数组的查找效率更高(尤其是当目标目录数量多的时候) - 如果需要处理大量文件,建议用
Directory.EnumerateFiles()代替GetFiles(),它是流式返回,内存占用更低
内容的提问来源于stack exchange,提问作者Tech Learner




