.net 如何检查文件名是否与通配符模式匹配?

.net 如何检查文件名是否与通配符模式匹配?,.net,.net,我知道我能行 Directory.GetFiles(@"c:\", "*.html") 我将得到一个与*.html文件模式匹配的文件列表 我想做相反的事情。给定文件名abc.html,我想要一个方法来告诉我该文件名是否匹配*.html模式。比如说 class.method("abc.html", "*.html") // returns true class.method("abc.xml", "*.html") // returns false class.method("abc.doc",

我知道我能行

Directory.GetFiles(@"c:\", "*.html")
我将得到一个与*.html文件模式匹配的文件列表

我想做相反的事情。给定文件名abc.html,我想要一个方法来告诉我该文件名是否匹配*.html模式。比如说

class.method("abc.html", "*.html") // returns true
class.method("abc.xml", "*.html") // returns false
class.method("abc.doc", "*.?oc") // returns true
class.method("Jan24.txt", "Jan*.txt") // returns true
class.method("Dec24.txt", "Jan*.txt") // returns false
该功能必须存在于dotnet中。我只是不知道它暴露在哪里

将模式转换为正则表达式可能是一种方法。然而,似乎有很多边缘案例,可能会带来更多的麻烦


注意:问题中的文件名可能还不存在,所以我不能简单地包装一个Directory.GetFiles调用并检查结果集是否有任何条目。

最简单的方法是将通配符转换为regex,然后应用它:

公共静态字符串通配符toregex(字符串模式)
{
返回“^”+Regex.Escape(模式)。
替换(“\\*”、“*”)。
替换(“\\?”,“)+“$”;
}
但如果出于某种原因不能使用正则表达式,则可以编写自己的通配符匹配实现。你可以找到一个

下面是从python实现移植的另一个(编辑2020-07:):

使用系统;
类应用程序
{
静态void Main()
{
Console.WriteLine(匹配(“abc.html”,“*.html”);//返回true
Console.WriteLine(匹配(“abc.xml”,“*.html”);//返回false
Console.WriteLine(匹配(“abc.doc”,“*。?oc”);//返回true
Console.WriteLine(匹配(“Jan24.txt”、“Jan*.txt”);//返回true
Console.WriteLine(匹配(“Dec24.txt”、“Jan*.txt”);//返回false
}
静态布尔匹配(字符串s1、字符串s2)
{
如果(s2==“*”| s1==s2)返回true;
如果(s1==“”| s2==“”)返回false;
if(s1[0]==s2[0]| | s2[0]=='?')返回匹配(s1.子字符串(1),s2.子字符串(1));
if(s2[0]='*')返回Match(s1.子字符串(1),s2)| | Match(s1,s2.子字符串(1));
返回false;
}
}

我认为
GetFiles
searchPattern
不支持完整的正则表达式。下面的代码可以是一个替代方案(但性能不是很好)


这不适用于无效的文件名<代码>匹配(“aaa/bbb.txt”,“*.txt”)将返回trueOriginal问题不包括路径,仅文件名匹配。但您总是可以使用Path.GetFileName()提取文件名。我说的是无效的文件名,如
aaa/bbb.txt
。不path@I4V:我认为这不是这个正则表达式的目的,您可以在进行匹配之前查找无效的文件名字符,搜索Path.GetInvalidFileNameChars。
bool IsMatch(string fileName,string searchPattern)
{
    try
    {
        var di = Directory.CreateDirectory("_TEST_");
        string fullName = Path.Combine(di.FullName, fileName);
        using (File.Create(fullName)) ;
        bool isMatch = di.GetFiles(searchPattern).Any();
        File.Delete(fullName);
        return isMatch;
    }
    catch
    {
        return false;
    }
}