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

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代码无法实现需求,核心问题有:

  1. LINQ查询中Where fi.Name Like SelectedtList语法错误,Like运算符不能直接与字符串列表匹配,且未处理带_00-00x后缀的衍生文件
  2. 查询变量引用错误:误用fi.Name,实际应使用循环变量f.Name
  3. 未处理扩展名大小写问题,也未对重复编码去重,可能导致重复添加文件

可行实现方案

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:27:01