使用Directory.GetFiles筛选含YYYYMMDD_HHMMSS格式日期的文件问题
解决方法:用正则表达式精准筛选文件名
这个问题我之前也碰到过,Directory.GetFiles()自带的通配符(*、?)确实满足不了这种精准的日期格式筛选需求——它只能做简单的模糊匹配,没法验证字符类型(比如必须是数字)和格式规则(比如8位日期、6位时间)。下面给你两个可行的解决方案:
方案1:仅匹配格式(不验证日期有效性)
如果只需要确保文件名包含_8位数字_6位数字的结构,不需要验证日期是否真实合法(比如不会出现20241301这种不存在的日期),可以用这个简单的实现:
using System.IO; using System.Text.RegularExpressions; using System.Linq; // 替换成你的目标目录路径 string targetDirectory = @"C:\Your\Target\Folder"; // 正则规则:匹配任意字符开头,后跟_8位数字_6位数字,再后跟任意字符(包括扩展名) Regex fileNamePattern = new Regex(@"^.*_\d{8}_\d{6}.*$", RegexOptions.IgnoreCase); // 获取所有文件并筛选符合格式的 var matchingFiles = Directory.GetFiles(targetDirectory) .Where(filePath => fileNamePattern.IsMatch(Path.GetFileName(filePath))) .ToList(); // 遍历输出结果 foreach (var file in matchingFiles) { Console.WriteLine($"符合格式的文件:{file}"); }
方案2:匹配格式+验证日期有效性
如果需要确保文件名中的日期是真实有效的(比如MM不会超过12、DD不会超过当月天数),可以在筛选时额外添加日期验证逻辑:
using System.IO; using System.Text.RegularExpressions; using System.Linq; using System.Globalization; string targetDirectory = @"C:\Your\Target\Folder"; Regex fileNamePattern = new Regex(@"^.*_\d{8}_\d{6}.*$", RegexOptions.IgnoreCase); var matchingFiles = Directory.GetFiles(targetDirectory) .Where(filePath => { string fileName = Path.GetFileName(filePath); // 先检查格式是否匹配 if (!fileNamePattern.IsMatch(fileName)) return false; // 提取文件名中的日期字符串(YYYYMMDD部分) int dateStartPos = fileName.IndexOf('_') + 1; string dateStr = fileName.Substring(dateStartPos, 8); // 尝试转换为DateTime,验证日期有效性 return DateTime.TryParseExact( dateStr, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out _); }) .ToList(); foreach (var file in matchingFiles) { Console.WriteLine($"格式合法且日期有效的文件:{file}"); }
为什么不用Directory.GetFiles的搜索模式?
比如你可能会尝试用*_????????_??????.*这样的通配符,但它会匹配任何8个字符+6个字符的组合(比如_ABCDEFGH_JKLMNO.txt),无法区分数字和其他字符,筛选精度完全达不到要求,所以正则表达式是更可靠的选择。
内容的提问来源于stack exchange,提问作者Merendandum
相关产品推荐
相关产品推荐

