如何删除目录及子目录中名称含指定字符串的文件?
C# 实现遍历多级目录删除含指定字符串的文件
核心修改方向
- 递归遍历子目录:替换原有的根目录文件获取逻辑,使用
Directory.EnumerateFiles的重载方法,指定SearchOption.AllDirectories参数来遍历目标目录下的所有层级子目录 - 文件名筛选逻辑:在获取文件列表时,新增判断条件,检查文件名是否包含指定的目标字符串
完整可运行代码
using System; using System.IO; using System.Linq; class TargetFileDeleter { static void Main(string[] args) { // 配置目标目录和要匹配的字符串 string targetDirectory = @"D:\TEMP\MYTEST"; string targetString = "3015494"; // 先校验目录是否存在 if (!Directory.Exists(targetDirectory)) { Console.WriteLine("指定的目标目录不存在,请检查路径"); return; } try { // 递归获取所有符合条件的文件:遍历所有子目录,筛选文件名含目标字符串的文件 var matchedFiles = Directory.EnumerateFiles( targetDirectory, "*", // 匹配所有类型文件,如需指定后缀可改为"*.mq5" SearchOption.AllDirectories) .Where(filePath => Path.GetFileName(filePath).Contains(targetString)); // 逐个删除文件并处理异常 foreach (var file in matchedFiles) { try { File.Delete(file); Console.WriteLine($"已成功删除:{file}"); } catch (IOException ex) { Console.WriteLine($"删除失败 {file}:文件正被占用或IO错误 - {ex.Message}"); } catch (UnauthorizedAccessException ex) { Console.WriteLine($"删除失败 {file}:无操作权限 - {ex.Message}"); } } } catch (UnauthorizedAccessException ex) { Console.WriteLine($"目录访问失败:无权限访问目标目录 - {ex.Message}"); } catch (DirectoryNotFoundException ex) { Console.WriteLine($"目录异常:目标目录在操作中被移除 - {ex.Message}"); } } }
关键细节说明
- 遍历效率优化:使用
EnumerateFiles而非GetFiles,前者采用延迟加载模式,无需一次性将所有文件路径加载到内存,适合处理大量文件或深层目录场景 - 筛选规则扩展:
- 如需忽略大小写匹配,将
Contains(targetString)改为Contains(targetString, StringComparison.OrdinalIgnoreCase) - 如需正则匹配复杂规则,可替换为
Regex.IsMatch(Path.GetFileName(filePath), @"你的正则表达式")(需引入System.Text.RegularExpressions命名空间)
- 如需忽略大小写匹配,将
- 异常容错处理:针对每个文件单独捕获删除异常,避免单个文件操作失败中断整个删除流程;同时捕获目录级别的权限、存在性异常,提升代码健壮性
内容的提问来源于stack exchange,提问作者Dragon
相关产品推荐
相关产品推荐

