C#实现删除文件名前缀重复的多余文件 仅保留首个匹配文件
按前缀匹配删除重复文件的C#实现
需求描述
目录下存在大量文件名前缀重复的文件,示例文件名如下:
afilename[a].txtafilename[f].txtafilename[j].txt
要求:保留相同前缀(即文件名中[符号之前的内容)的第一个文件,其余同前缀文件全部删除,上述示例最终仅保留afilename[a].txt。
原有代码问题
原有代码按完整文件名分组,无法实现仅对比[前的前缀部分匹配的需求:
var duplicateNames = files.GroupBy(file => file.Name) .Where(group => group.Count() > 1) .Select(group => group.Key);
需要实现的效果:仅比较文件名中[之前的部分,返回除首个匹配文件之外的所有完整文件名列表用于删除。
最终解决方案
可通过按[前的子串分组,取每组排序第一的文件保留,其余文件删除即可,实现代码如下:
using System; using System.IO; using System.Linq; public class Program { public static void Main() { // 指定扫描目录路径 string directoryPath = @"C:\temp\dups"; // 读取目录下所有符合后缀的文件,此处示例匹配.mp3,可按需修改 var allFiles = Directory.GetFiles(directoryPath, "*.mp3", SearchOption.AllDirectories); // 筛选需要保留的文件:先过滤文件名包含[的文件,按[前的前缀分组,取每组中排序第一的文件保留 var toKeep = allFiles.Where(file => file.Contains('[')) .GroupBy(file => file.Remove(file.IndexOf('['))) .Select(group => group.Min()) .ToHashSet(); // 计算需要删除的文件:所有文件排除需要保留的部分 var whatToDelete = allFiles.Except(toKeep); // 执行删除 foreach (var fileToDelete in whatToDelete) { File.Delete(fileToDelete); } } }
内容的提问来源于stack exchange,提问作者Ian Thompson
相关产品推荐
相关产品推荐

