C#如何基于修改日期从指定路径获取最新的AMCR_Handoff_Report文件
C# 高效获取指定目录下匹配命名规则的最新文件方案
前置问题修正
首先排查现有代码的两个隐性问题:
- 搜索模式存在笔误:目标文件前缀为
AMCR_Handoff_Report_,但代码中写的是AMCAR_Handoff_Report_,多了字母A,会导致匹配不到正确文件 - 方法参数错误:
Directory.GetFiles第一个参数需传入目标目录的纯路径,不需要带文件名,你当前参数名amcrNDMPathWithFileName说明可能传了带文件名的路径,会导致搜索路径错误
方案1:基于文件修改时间筛选(推荐,符合需求)
使用Directory.EnumerateFiles替代Directory.GetFiles,前者为延迟加载机制,不需要一次性把所有文件路径加载到内存,文件数量较多时内存占用远低于原有方案,配合LINQ可以快速筛选出最新文件:
using System.IO; using System.Linq; // amcrNDMPath 为文件存储目录的纯路径 var latestFile = Directory.EnumerateFiles(amcrNDMPath, "AMCR_Handoff_Report_*", SearchOption.TopDirectoryOnly) .Select(f => new FileInfo(f)) .OrderByDescending(fi => fi.LastWriteTime) .FirstOrDefault(); // 判空后即可使用,文件路径为 latestFile.FullName if (latestFile != null) { // 业务处理逻辑 }
如果只需要获取文件路径,可以简化为:
var latestFilePath = Directory.EnumerateFiles(amcrNDMPath, "AMCR_Handoff_Report_*", SearchOption.TopDirectoryOnly) .OrderByDescending(f => File.GetLastWriteTime(f)) .FirstOrDefault();
方案2:基于文件名日期解析筛选(性能更高,适合文件名日期完全可靠的场景)
你的文件命名中日期为固定的ddMMyyyy格式,直接解析文件名日期不需要读取文件系统属性,文件量极大时性能更高,适合可以保证文件名日期完全准确、不会被人为修改的场景:
using System.IO; using System.Linq; using System.Globalization; var latestFile = Directory.EnumerateFiles(amcrNDMPath, "AMCR_Handoff_Report_*", SearchOption.TopDirectoryOnly) .Select(f => new { Path = f, DatePart = Path.GetFileNameWithoutExtension(f).Split('_').Last() }) // 过滤掉不符合命名规则的文件 .Where(x => DateTime.TryParseExact(x.DatePart, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _)) .OrderByDescending(x => DateTime.ParseExact(x.DatePart, "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.None)) .FirstOrDefault();
内容的提问来源于stack exchange,提问作者Tausif Khan
相关产品推荐
相关产品推荐

