VSTO中如何根据字符串列表匹配多扩展名目标文件?
基于编码列表筛选对应扩展名的文件(含衍生编号文件)
场景说明
- 待匹配的编码列表:
AA000017 FF100218 P0100217 DF100216 CODICE - CODE A010AA77 B0000017
- 目标文件夹内的文件示例:
DF100216.DXF DF100216.DWG DF100216.PDF DF100216.STP FF100218.PDF FF100218_00-001.PDF FF100218_00-002.PDF FF100218_00-003.PDF FF100218.STP ecc
- 筛选需求:每个编码对应一批文件,比如筛选编码
FF100218的PDF文件时,需返回:
FF100218.PDF FF100218_00-001.PDF FF100218_00-002.PDF FF100218_00-003.PDF
原代码问题
原VB代码无法实现需求,核心问题有:
- LINQ查询中
Where fi.Name Like SelectedtList语法错误,Like运算符不能直接与字符串列表匹配,且未处理带_00-00x后缀的衍生文件 - 查询变量引用错误:误用
fi.Name,实际应使用循环变量f.Name - 未处理扩展名大小写问题,也未对重复编码去重,可能导致重复添加文件
可行实现方案
方案1:使用StartsWith判断(简单直接)
通过判断文件名是否以目标编码开头,同时匹配指定扩展名,覆盖主文件和衍生文件:
' 初始化编码列表和目标扩展名 Dim SelectedList As New List(Of String) From {"DF100216", "FF100218", "DF100216"} Dim DrawingExtensionList As New List(Of String) From {".PDF", ".TIF"} Dim fileList As New List(Of IO.FileInfo) Dim DrawingPath_Internal As String = "你的目标文件夹路径" ' 替换为实际路径 ' 对编码列表去重,避免重复处理相同编码 Dim uniqueCodes = SelectedList.Distinct() For Each code In uniqueCodes For Each ext In DrawingExtensionList ' 获取当前扩展名的所有文件 Dim targetFiles = New IO.DirectoryInfo(DrawingPath_Internal).GetFiles($"*{ext}") ' 筛选文件名以当前编码开头、扩展名匹配的文件(忽略大小写) Dim matchedFiles = From f In targetFiles Where f.Name.StartsWith(code, StringComparison.OrdinalIgnoreCase) AndAlso f.Extension.Equals(ext, StringComparison.OrdinalIgnoreCase) Select f fileList.AddRange(matchedFiles) Next Next ' 输出筛选结果(可根据需求调整用途) For Each file In fileList Console.WriteLine(file.Name) Next
方案2:使用正则表达式(精准匹配)
如果需要避免编码前缀误匹配(比如编码DF1002误匹配DF10021.PDF),可以用正则表达式严格匹配编码+可选后缀+扩展名的格式:
Imports System.Text.RegularExpressions ' 初始化变量 Dim SelectedList As New List(Of String) From {"DF100216", "FF100218", "DF100216"} Dim DrawingExtensionList As New List(Of String) From {".PDF", ".TIF"} Dim fileList As New List(Of IO.FileInfo) Dim DrawingPath_Internal As String = "你的目标文件夹路径" Dim uniqueCodes = SelectedList.Distinct() For Each code In uniqueCodes For Each ext In DrawingExtensionList ' 构造正则表达式:编码开头,可跟_xxx后缀,最后是指定扩展名(忽略大小写) Dim regexPattern = $"^{Regex.Escape(code)}(_.*)?{Regex.Escape(ext)}$" Dim matchRegex = New Regex(regexPattern, RegexOptions.IgnoreCase) Dim targetFiles = New IO.DirectoryInfo(DrawingPath_Internal).GetFiles($"*{ext}") Dim matchedFiles = From f In targetFiles Where matchRegex.IsMatch(f.Name) Select f fileList.AddRange(matchedFiles) Next Next ' 输出结果 For Each file In fileList Console.WriteLine(file.Name) Next
关键改进点
- 对编码列表去重,避免重复添加相同文件
- 支持扩展名大小写不敏感匹配
- 覆盖带
_00-00x后缀的衍生文件 - 修正原代码的语法错误和变量引用问题
内容的提问来源于stack exchange,提问作者Gianfranco Vrech
相关产品推荐
相关产品推荐

