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

C#实现:提取目录中每日版本号最高的文件至ArrayList

解决思路与C#实现方案

我来一步步帮你搞定这个需求~考虑到你C#基础比较薄弱,我会把思路拆得很细,再配上带详细注释的代码,你跟着走就行。

核心逻辑拆解

  • 筛选目标文件:先把目录里符合AAyyyyMMdd_n.txt格式的文件挑出来,避免处理无关文件。
  • 按日期分组:从文件名里提取日期段(比如AA20180501_1.txt里的20180501),把同一日期的文件归为一组。
  • 挑选最高版本:每组里提取版本号(下划线后面的数字),找出数字最大的那个文件。
  • 存入ArrayList:把筛选后的文件路径(或文件对象)添加到ArrayList中。

完整C#代码实现

using System;
using System.Collections;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // 替换成你的目标目录路径,注意路径里的斜杠要写成双斜杠或者用@符号
        string targetDirectory = @"C:\Your\Target\Folder";
        
        // 用来存放最终结果的ArrayList
        ArrayList highestVersionFiles = new ArrayList();

        try
        {
            // 1. 先获取目录下所有以AA开头的txt文件,做初步筛选
            var allTargetFiles = Directory.GetFiles(targetDirectory, "AA*.txt");

            // 2. 解析文件名、提取日期和版本号,然后按日期分组
            var filesGroupedByDate = allTargetFiles
                .Select(filePath => 
                {
                    // 先拿到纯文件名(去掉路径)
                    string fileName = Path.GetFileName(filePath);
                    // 按下划线拆分文件名,比如"AA20180501_3.txt"会拆成["AA20180501", "3.txt"]
                    string[] nameParts = fileName.Split('_');
                    
                    // 如果拆分后不是两部分,说明不符合命名规则,跳过
                    if (nameParts.Length != 2)
                    {
                        return null;
                    }

                    // 提取日期部分:去掉开头的"AA",剩下的8位就是日期(比如20180501)
                    string dateSegment = nameParts[0].Substring(2);
                    // 提取版本号:把第二部分的.txt去掉,转成整数
                    if (int.TryParse(nameParts[1].Replace(".txt", ""), out int versionNum))
                    {
                        return new 
                        {
                            FullPath = filePath,
                            Date = dateSegment,
                            Version = versionNum
                        };
                    }
                    // 版本号不是数字的话,也跳过
                    return null;
                })
                .Where(parsedItem => parsedItem != null) // 过滤掉不符合规则的文件
                .GroupBy(item => item.Date); // 按日期分组

            // 3. 遍历每个日期组,找出版本号最高的文件
            foreach (var dateGroup in filesGroupedByDate)
            {
                // 按版本号从高到低排序,取第一个就是该日期的最高版本文件
                var topVersionFile = dateGroup
                    .OrderByDescending(item => item.Version)
                    .FirstOrDefault();
                
                if (topVersionFile != null)
                {
                    // 把文件路径添加到ArrayList里
                    highestVersionFiles.Add(topVersionFile.FullPath);
                    Console.WriteLine($"已添加日期{dateGroup.Key}的最高版本文件:{topVersionFile.FullPath}");
                }
            }

            // 输出最终结果,方便你验证
            Console.WriteLine("\n=== 最终筛选结果 ===");
            foreach (var file in highestVersionFiles)
            {
                Console.WriteLine(file);
            }
        }
        catch (Exception ex)
        {
            // 捕获异常,避免程序崩溃,同时输出错误信息
            Console.WriteLine($"程序运行出错:{ex.Message}");
        }
    }
}

给C#新手的实用建议

  • 调整路径:记得把代码里的targetDirectory换成你实际的目录路径,路径可以用@符号避免转义问题。
  • 理解ArrayList:虽然现在C#更推荐用泛型集合List<string>(类型更安全),但你要求用ArrayList,代码里已经按需求实现了。如果后续想优化,直接把ArrayList改成List<string>即可,Add方法用法完全一样。
  • 调试技巧:可以在Visual Studio里给代码加断点,一步步查看每个文件的解析、分组过程,这样能更直观地理解每一步的逻辑。
  • 异常处理:代码里加了try-catch块,能处理比如目录不存在、没有访问权限这类问题,新手写代码尽量养成加异常处理的习惯,避免程序突然崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:09