/// <summary> /// Returns true if the string matches the pattern which may contain * and ? wildcards. /// </summary> /// <param name="pattern">Pattern to match.</param> /// <param name="fileName">Filename to match.</param> /// <param name="caseSensitive">If the match is case sensitive or not.</param> /// <returns>True if the patterna and the fileName match, false if not.</returns> /// <remarks> /// Based on robagar C# port of Jack Handy Codeproject article: /// http://www.codeproject.com/string/wildcmp.asp#xx1000279xx /// </remarks> private bool Match(string pattern, string fileName, bool caseSensitive) { // if not concerned about case, convert both string and pattern // to lower case for comparison if (!caseSensitive) { pattern = pattern.ToLower(); fileName = fileName.ToLower(); } if (string.IsNullOrEmpty(pattern)) { return(false); //如果空字符 返回没有 } if (pattern.CompareTo("*") == 0 || pattern.CompareTo("*.*") == 0) { return(true);//快速匹配 } // if pattern doesn't actually contain any wildcards, use simple equality //if (pattern.IndexOfAny(Wildcards) == -1)//不存在匹配符号 // return (fileName == pattern); bool findP = false; foreach (var v1 in Wildcards) { foreach (var v2 in pattern) { if (v1.CompareTo(v2) == 0) { findP = true; break; } } } if (!findP) { return(fileName == pattern); } // otherwise do pattern matching SearchPattern mSearchPattern = new SearchPattern(pattern); return(mSearchPattern.IsMatch(fileName)); //下面逻辑可能有点问题 int i = 0; int j = 0; while (i < fileName.Length && j < pattern.Length && pattern[j] != '*') { if ((pattern[j] != fileName[i]) && (pattern[j] != '?')) { return(false); } i++; j++; } // if we have reached the end of the pattern without finding a * wildcard, // the match must fail if the string is longer or shorter than the pattern if (j == pattern.Length) { return(fileName.Length == pattern.Length); } int cp = 0; int mp = 0; while (i < fileName.Length) { if (j < pattern.Length && pattern[j] == '*') { if ((j++) >= pattern.Length) { return(true); } mp = j; cp = i + 1; } else if (j < pattern.Length && (pattern[j] == fileName[i] || pattern[j] == '?')) { j++; i++; } else { j = mp; i = cp++; } } while (j < pattern.Length && pattern[j] == '*') { j++; } return(j >= pattern.Length); }