You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#从FileInfo列表筛选设备日志最新版本的技术问询

解决方案:按设备分组筛选最新日志文件

步骤1:过滤旧版本文件

首先排除带有_yyyyMMdd_HHmmss后缀的旧副本。通过正则匹配文件名(不含扩展名)的结尾模式,识别并过滤这类文件:

  • 正则表达式@"_(\d{8})_(\d{6})$"用于匹配时间戳后缀,符合该模式的文件直接排除。

步骤2:提取设备标识并分组

根据文件名规则,设备的唯一标识由「房间标识+a开头的1-3位数字」组成(例如Room1_a123)。用正则@"^(.*a\d{1,3})_ContentLink$"捕获该标识作为分组键,将过滤后的文件按设备分组。

步骤3:每组取最新文件

对每个设备分组,按LastWriteTime降序排序,取第一个元素即为该设备的最新日志文件。


完整C#代码示例

using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

// 假设已通过目录获取allFiles数组
FileInfo[] allFiles = Directory.GetFiles(@"你的日志目录路径", "*", SearchOption.TopDirectoryOnly)
                               .Select(path => new FileInfo(path))
                               .ToArray();

// 过滤旧版本文件
var validFiles = allFiles.Where(file => 
{
    string fileNameWithoutExt = Path.GetFileNameWithoutExtension(file.Name);
    // 排除带时间戳后缀的旧文件
    return !Regex.IsMatch(fileNameWithoutExt, @"_(\d{8})_(\d{6})$");
});

// 按设备分组并提取每个设备的最新文件
var latestFilesPerDevice = validFiles
    .GroupBy(file => 
    {
        string fileNameWithoutExt = Path.GetFileNameWithoutExtension(file.Name);
        Match match = Regex.Match(fileNameWithoutExt, @"^(.*a\d{1,3})_ContentLink$");
        // 返回设备标识,匹配失败则返回空字符串后续过滤
        return match.Success ? match.Groups[1].Value : string.Empty;
    })
    .Where(group => !string.IsNullOrEmpty(group.Key)) // 过滤无效分组
    .Select(group => group.OrderByDescending(file => file.LastWriteTime).First())
    .ToArray();

补充说明

  • 若CreationTime更适合判断文件新旧,可替换代码中的LastWriteTime;
  • 若房间标识有明确格式(如固定长度、特定分隔符),可优化正则表达式提升匹配准确性;
  • 代码中加入了匹配失败的过滤逻辑,避免不符合命名规则的文件干扰最终结果。

内容的提问来源于stack exchange,提问作者3xcelsior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:10:28