首页 > 解决方案 > 需要根据输入文件号查找确切的文件名列表

问题描述

我需要根据我输入的文件编号制作一个图像文件列表。我只能找到具有该文件编号的图像文件,即使图像文件之前和/或之后可能具有相同的字符。因此,我试图根据文件编号在文件夹结构中定位一些图像文件。因此,如果文件编号是“00441”,我需要找到编号如下的文件:

因此,如果每个图像文件都有像这些示例一样的下划线,这将不是问题,但是,有些没有下划线。并且有些文件编号具有后缀,例如我们有 '00441' 和 '00441A' 所以,除了上面列出的图像文件之外,我可能还有:

因此,由于这些问题,我不能在下划线处中断,也不能使用 StartsWith(如下面的代码),因为所有这些示例都以“00441”开头,只是有些以“A”结尾。这是我到目前为止的代码,但由于我之前所说的,它不起作用。

    LocalFile = "IM" + FileNumber;
    if (ValidateFilepath(di))
        lstDocuments = di.GetFiles("*.jpg")
        .Where(file => file.Name.ToUpperInvariant().StartsWith(LocalFile))
        .Select(file => file.FullName).ToList(); //  The ToUpperInvariant() makes the file name upper case, because the actual file names are not consistent.

标签: c#

解决方案


我建议为此使用正则表达式

这是一个示例(00441pattern变量中的 替换为您要搜索的文件名):

using System.Text.RegularExpressions;

// ...

var files = new List<string>
{
    "IM00441_000A.jpg", 
    "IM00441_205A.jpg", 
    "IM00441_110D.jpg", 
    "IM00441_A11.jpg",  
    "IM00441A_000A.JPG",
    "IM00441A_105A.JPG",
    "IM00441A_110A.JPG",
    "IM00441A_302A.JPG",
    "IM00123_123A.jpg", 
    "IM00123A_123B.jpg",
    "AIM00123_123C.jpg",
    "IM00456_123A.jpg", 
    "IM00456A_123B.jpg",
    "AIM00456_123C.jpg" 
};

var pattern = @".+00441.*\.[jpg|JPG]";

foreach (var file in files)
{
    if (Regex.IsMatch(file, pattern))
        Console.WriteLine($"Found file: {file}");
}       

// Output:
//     Found file: IM00441_000A.jpg
//     Found file: IM00441_205A.jpg
//     Found file: IM00441_110D.jpg
//     Found file: IM00441_A11.jpg
//     Found file: IM00441A_000A.JPG
//     Found file: IM00441A_105A.JPG
//     Found file: IM00441A_110A.JPG
//     Found file: IM00441A_302A.JPG

推荐阅读