使用 C# 在目录中查找丢失的文件名

Find Missing File Names in directory using c#

我有一个目录,预计有 21 个文件,范围从 0 到 20。文件以下划线和 0 到 20 之间的数字结尾(可能是 _01 或 _1 格式),命名约定如下:

DirectoryName_00.txt, DirectoryName_01.txt,..., DirectoryName_20.txt Or DirectoryName_0.txt, DirectoryName_1.txt,..., DirectoryName_20.txt

我想找出现在丢失的文件我正在使用以下代码片段:

for (int pageNum = 0; pageNum <= 20; pageNum++)
{   
    //templateFiles is list of files in that directory
    string expectedTemplateName = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00"));
    templateFiles.Any(file => file.Equals(expectedTemplateName, StringComparison.OrdinalIgnoreCase));
}

但是通过这种方法,我只能搜索格式为 00,01,02,03...20 的文件,无法搜索格式为 0,1,2,3...20 的文件。 有什么简短的方法可以让我搜索两种格式的文件(可能使用 RegEx)。

做两次,

for (int pageNum = 0; pageNum <= 20; pageNum++)
{   
    //templateFiles is list of files in that directory
    string expectedTemplateName1 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString());
    string expectedTemplateName2 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00"));
    templateFiles.Any(file => 
        (file.Equals(expectedTemplateName1, StringComparison.OrdinalIgnoreCase) || 
        file.Equals(expectedTemplateName2, StringComparison.OrdinalIgnoreCase)));
}

像这样:

var re = new Regex("_[\d].");
var resultedFiles = templateFiles.Where(x => re.IsMatch(x));

在这种情况下,正则表达式可能不是最好的工具,这就是为什么我会直接使用@kennyzx 的直接方法。如果你非常想使用正则表达式,你可以使用以下内容;但请注意,这比直接字符串比较慢 >800%——而且也不一定更容易理解。

for (int pageNum = 0; pageNum <= 20; pageNum++)
{   
    var regex = new Regex(string.Format(@"^{0}_(?:{1}|{1:00})\.txt$", directoryName, pageNum), RegexOptions.IgnoreCase);
    templateFiles.Any(file => regex.IsMatch(expectedTemplateName, StringComparison.OrdinalIgnoreCase));
}