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
相关产品推荐
相关产品推荐

