2013-03-26 124 views
1

我知道我可以做如何檢查文件名是否匹配通配符模式?

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調用並檢查結果集是否有任何條目。去

回答

4

最簡單的方法是將您的通配符轉換爲正則表達式,然後應用它:

public static string WildcardToRegex(string pattern) 
{ 
    return "^" + Regex.Escape(pattern). 
    Replace("\\*", ".*"). 
    Replace("\\?", ".") + "$"; 
} 

但是,如果你不能使用正則表達式出於某種原因,你可以寫自己的實現通配符匹配的。你可以找到一個here

這裏是另外一個從Python實現移植:

using System; 

class App 
{ 
    static void Main() 
    { 
    Console.WriteLine(Match("abc.html", "*.html")); // returns true 
    Console.WriteLine(Match("abc.xml", "*.html")); // returns false 
    Console.WriteLine(Match("abc.doc", "*.?oc")); // returns true 
    Console.WriteLine(Match("Jan24.txt", "Jan*.txt")); // returns true 
    Console.WriteLine(Match("Dec24.txt", "Jan*.txt")); // returns false 
    } 

    static bool Match(string s1, string s2) 
    { 
    if (s2=="*" || s1==s2) return true; 
    if (s1=="") return false; 

    if (s1[0]==s2[0] || s2[0]=='?') return Match(s1.Substring(1),s2.Substring(1)); 
    if (s2[0]=='*') return Match(s1.Substring(1),s2) || Match(s1,s2.Substring(1)); 
    return false; 
    } 
} 
+0

這對於無效的文件名不起作用。 'Match(「aaa/bbb.txt」,「* .txt」);'將返回* true * – I4V 2013-03-26 21:50:21

+1

原始問題不包含路徑,只包含文件名匹配。但是您始終可以使用Path.GetFileName()提取文件名。 – Alexander 2013-03-27 07:20:55

+0

我說**無效的**文件名像'aaa/bbb.txt'。不*路徑* – I4V 2013-03-27 16:54:23

0

我不認爲GetFilessearchPattern並支持完整的正則表達式。下面的代碼可以替代(但不是非常高效)

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; 
    } 
} 
相關問題